accepts_nested_attributes_for是否服从has_many声明中的条件?

时间:2011-01-15 19:23:04

标签: ruby-on-rails nested-forms has-many-through nested-attributes

按照我目前设置代码的方式,用户has_many current_treatments(与其他处理不同,因为它们与用户之间的关联将布尔“当前”设置为true)。我遇到的问题是,当我尝试通过accepts_nested_attributes_for以嵌套形式指定用户的当前处理时,“待处理”不会使用“当前”布尔值集保存。

我假设accepted_nested_attributes_for为你工作。不是吗?如果是的话,我做错了什么?如果没有,实现这一目标的最佳实践方式是什么?

这是我的例子:

 # user.rb
  has_many :treatings
  has_many :treatments, :through => :treatings
  has_many :current_treatments, :through => :treatings, :conditions => {'treatings.current' => true}, :source => :treatment

  accepts_nested_attributes_for :current_treatments

我试图让用户通过以下方式设置他当前的治疗方法:

 # user/edit.html.erb
  <%= select_tag "user[current_treatment_ids][]", options_from_collection_for_select(Treatment.all, "id", "name", @user.current_treatment_ids), :multiple=>true %><br/>

但是在提交表格后,我得到的结论是:

 # development.log
  SQL (0.4ms)  INSERT INTO "treatings" ("created_at", "current", "treatment_id", "updated_at", "user_id") VALUES ('2011-01-15 18:49:02.141915', NULL, 4, '2011-01-15 18:49:02.141915', 1)

请注意,保存新处理时不会将“current”布尔值设置为true,如has_many声明中所指定的那样。

编辑:这是Treatment型号。

class Treatment < ActiveRecord::Base

  has_many :treatings
  has_many :users, :through => :treatings
  has_many :current_users, :through => :treatings, :conditions => {:current => true}, :source => :user
  has_many :past_users, :through => :treatings, :conditions => {:current => false}, :source => :user

end

1 个答案:

答案 0 :(得分:1)

我自己发现了明显的问题:

# user/edit.html.erb 
<%= select_tag "user[current_treatment_ids][]", options_from_collection_for_select(Treatment.all, "id", "name", @user.current_treatment_ids), :multiple=>true %><br/>

通过id“user [current_treatment_ids] []”使用select_tag永远不会调用accepts_nested_attributes生成的方法。 id必须是“user [current_treatment_attributes] []”的范围。

但是我认为这引发了一个问题:我是否真的想要accept_nested_attributes_for:current_treatment,或者更确切地说,在:user和:current_treatment之间的关联,也就是所谓的:current_treating。据我所知,Accepts_nested_attributes_for旨在创建新对象。我不打算在这里创造新的治疗方法,只是新的治疗方法(也就是两者之间的关联)。

无论如何,稍微和自己说话,但我打算将此标记为已解决,因为我希望这个问题的方向不再像我希望的那样尖锐。