Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby On Rails > Заполнение collection_select


Автор: masterbloger 7.7.2011, 17:53
Здравствуйте! 
Есть такой код:
Код

collection_select( :feature_id, Issue.find(:all, :conditions => "(project_id = #{@project.id})and(tracker_id = 2)"), :id, :subject, {:include_blank => 'Please Select'})


Он выводит на экран выпадающий список с набором записей которые берутся из таблицы Issue базы данных. Сейчас в списке отображается только параметр subject, но мне нужно отображать запись в виде #id: subject. Помогите пожалуйста разобраться с этой задачей, а то я с Руби только недавно работаю. 

Автор: masterbloger 8.7.2011, 10:58
Сделал как написано в документации.
Код

class UserStory < ActiveRecord::Base
  belongs_to :issue
end

class Issue < ActiveRecord::Base
  has_many :user_stories

  def subject_with_id
    "#{id}. #{subject}"
  end
end


Код

f.collection_select(:feature_id, Issue.find(:all, :conditions => "(project_id = #{@project.id})and(tracker_id = 2)"), :id, :subject_with_id, {:include_blank => 'Please Select'})


Не помогло. Так вообще не работает.

Автор: source777 8.7.2011, 12:18
Во-первых, перенеси обращение к модели в контроллер и желательно в виде:
Код

@issues = Issue.where(:project_id => @project.id,  :tracker_id => 2)

А то привыкнешь ещё уязвимый для SQL-Injections код писать...

А во view попробуй:
<%= f.select(:feature_id, @issues.collect {|iss| [ "##{iss.id}: #{iss.subject}", iss.id ] }, { :include_blank => true }) %>
или
<%= select(@your_object, :feature_id, @issues.collect {|iss| [ "##{iss.id}: #{iss.subject}", iss.id ] }, { :include_blank => true }) %>
или, допуская вероятность нестандартной формы, даже так:
<%= select(:feature_id, @issues.collect {|iss| [ "##{iss.id}: #{iss.subject}", iss.id ] }, { :include_blank => true }) %>

Курсив заменить на свои значения

Автор: masterbloger 8.7.2011, 14:47
Цитата(source777 @  8.7.2011,  12:18 Найти цитируемый пост)
Во-первых, перенеси обращение к модели в контроллер и желательно в виде:
Выделить всёБез подсветки
1:
    
@issues = Issue.where(:project_id => @project.id,  :tracker_id => 2)


Обращение к модели перенес в контроллер. но в том виде что Вы предложили оно почему-то не работает.
А вот так заработало:
Код

@issues = Issue.find(:all, :conditions => "(project_id = #{@project.id})and(tracker_id = 2)")


добавил в форму следующий код:
Код

f.select(:feature_id, @issues.collect {|iss| [ "##{iss.id}: #{iss.subject}", iss.id ] }, { :include_blank => true })


и получил, то что хотел
А в чём разница между find и where? И почему не сработал where?

Автор: source777 8.7.2011, 23:51
Цитата(masterbloger @  8.7.2011,  14:47 Найти цитируемый пост)
А в чём разница между find и where? И почему не сработал where? 

Я рассчитывал, что ты используешь Rails 3.x, для Rails 2.x должно быть так:
Код

@issues = Issue.find(:all, :conditions => {:project_id => @project.id,  :tracker_id => 2})


Добавлено через 6 минут и 12 секунд
Подробнее на эту тему почитай в статье: http://m.onkey.org/active-record-query-interface
На мой взгляд для новичка не слишком дальновидно привыкать использовать deprecated методы. Хотя legacy-кода хватает...  smile 

Автор: masterbloger 11.7.2011, 09:54
Спасибо большое за ссылки и советы.
То есть, получается, что мой код просто не будет работать на Rails 3.1.
А так вообще в методе find нет ничего опасного.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)