2010-09-22 33 views
3

复选框基于以下车型的Rails 3 has_and_belongs_to_many创建鉴于

class Company < ActiveRecord::Base 
    has_and_belongs_to_many :origins 
end 

class Origin < ActiveRecord::Base 
    has_and_belongs_to_many :companies 
end 

我想在我的companies/_form有代表所有来源的复选框的集合。

不知道Company.new(params[:company])companies_controller#create可以创建公司和选定的来源之间的关联吗?

我正在运行rails 3.0.0,实现该目标的最佳方法是什么?

感谢您的见解

回答

9

的habtm是不是一个受欢迎的选择,这些天,最好是使用的has_many:通过替代,用适当的之间的连接模式。这会为您提供公司#origin_ids =的方法,您可以从您的表单传递一组原始ID,以便为@company设置所有关联的来源。例如

<% current_origin_ids = @company.origin_ids %> 
<% form_for @company do |f| %> 
    <label>Name:<%= f.text_field :name %></label> 
    <% Origin.all.each do |origin| %> 
    <label><%= origin.name %> 
     <%= check_box_tag "company[origin_ids][]", origin.id, current_origin_ids.include?(origin.id) %> 
    </label> 
    <% end %> 
<% end %> 

顺便说一句,使用适当的加盟模式,与相应的控制器,让你可以轻松地添加/删除与AJAX的起源,利用创建/删除的连接模型的控制器调用。

+0

真棒,谢谢 – denisjacquemin 2010-09-22 12:46:50

+0

你可能要添加一个隐藏字段标签,否则它不会,如果你的工作取消所有。 hidden_​​field_tag'company [origin_ids] []',[] – Agustin 2014-02-22 22:11:48

+0

@Austin - 好点 – 2014-02-24 12:22:35

2

就我个人而言,我并不认为“多 - 通”总是更好,这取决于您的情况。如果您的连接模型有任何属性本身的可能性,则“多通过”会更好。改变更灵活。它消除了一些Rails约定的魔力。但是,如果你不需要多次通过,那么可能会派上用于HABTM checkboxes的旧版RailsCast。

3

我不得不同意@carpeliam has_many :through不应该是默认选择。 HABTM工作正常,代码少。它也不会限制ajax的使用,并且会公开一个可以传递一个id数组的ID设置器。因此screencast,而从2007年,仍然使用Rails 3.其他选项工作,如果使用simple_form是这样的:

= form.association :origins, :as => :check_boxes 
相关问题