Rails关联和表单

Jas*_*ett 5 ruby-on-rails

我有一个名为的模型appointment.每个appointment都有一个stylist.在我创建新的表单中appointment,我这样做:

  <div class="field">
    <%= f.label :stylist_id %><br />
    <%= f.select(:stylist_id, Stylist.order("name").map { |s| [s.name, s.id] }) %>
  </div>
Run Code Online (Sandbox Code Playgroud)

这可行,但对我的应用程序中的每个关联做这种事情会很乏味.我想Rails有一些方法可以自动生成关联的选择字段,但我不知道它是如何工作的.这样的事情存在吗?

哦,顺便说一句,我已经知道脚手架了.如果脚手架应该照顾我上面描述的内容,我显然做错了,因为它不是为我做的.

(我在Rails 3.)

pru*_*wan 23

嗯,似乎collection_select适用于典型场景:

<%= f.collection_select :stylist_id, Stylist.all, :id, :name %>
Run Code Online (Sandbox Code Playgroud)


von*_*rad 5

尽管RobinBrouwer的答案是正确的,但我只想分享我为工作中的一个应用程序想到的一点点建议:

# config/initializers/to_options.rb
module ActiveRecord
  class Base
    def self.to_options(title=:name)
      self.all.map{|r| [r.send(title), r.id]}
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,您可以to_options在任何模型上使用,并且可以灵活选择选项文本的任何字段(默认为name)。

Model.to_options # => Creates select options with [m.name, m.id]
AnotherModel.to_options(:title) # => Creates select options with [m.title, m.id]
Run Code Online (Sandbox Code Playgroud)

如有必要,也不难通过订购进行修改。