嵌套属性未更新

时间:2011-06-08 02:31:38

标签: has-many nested-attributes

使用以下型号:

class Location < ActiveRecord::Base
  has_many        :group_locations
  has_many        :groups, :through => :group_locations
  accepts_nested_attributes_for :group_locations
end

class GroupLocation < ActiveRecord::Base
  belongs_to  :group
  belongs_to  :location
end

class Group < ActiveRecord::Base
  has_many        :group_locations
  has_many        :locations, :through => :group_locations
end

rails控制台中的以下命令不会更新关联的记录:

>> l = Location.find(1)
=> #<Location id: 1, phone: "(949) 788-9999", ... created_at: "2011-06-02 00:58:07",
updated_at: "2011-06-07 23:57:32">

\>\> l.group_locations
=> [#<GroupLocation group_id: 4, location_id: 1, created_at: "2011-06-02 00:58:07",
updated_at: "2011-06-02 00:58:07">, #<GroupLocation group_id: **37**, location_id: 1,
created_at: "2011-06-02 00:58:07", updated_at: "2011-06-02 00:58:07">]

>> l.update_attributes(:phone => "(949) 788-9998", :group_locations_attributes =>
[{:group_id => 4, :location_id => 1}, {:group_id => **38**, :location_id => 1}])
=> true

>> l
=> #<Location id: 1, phone: "(949) 788-9998", ... created_at: "2011-06-02 00:58:07",
updated_at: "2011-06-08 02:05:00">

>> l.group_locations
=> [#<GroupLocation group_id: 4, location_id: 1, created_at: "2011-06-02 00:58:07",
updated_at: "2011-06-02 00:58:07">, #<GroupLocation group_id: **37**, location_id: 1,
created_at: "2011-06-02 00:58:07", updated_at: "2011-06-02 00:58:07">]

请注意,update_attributes调用尝试将第二个GroupLocation更改为group_id = 38,但未进行更改(即使电话号码确实发生了更改)。在查看在控制器和视图中实现此代码时生成的代码之后,将数组更改为哈希(在这种情况下创建的内容)没有不同的结果(并且表单/控制器)具有不更新的相同效果即使主记录已更新,也会显示相关记录。

知道我需要做些什么才能让嵌套属性更新?

2 个答案:

答案 0 :(得分:1)

从您显示的日志中,您的GroupLocation模型似乎没有:id主键。虽然HABTM的连接表上只有外键(group_id,location_id),但用于has_many:through关联的模型也需要一个主键,默认情况下为:id。否则,在更新的情况下无法确定要更新哪个子对象。

以这种方式思考 - 您正在通过另一个应该能够独立完成的离散模型来创建您的关联。

嵌套属性的约定是,传递给nested_attributes的散列包含:id,然后它被认为是更新,如果不是,那么它被认为是创建。在您的情况下,您没有传入:id,因此您只需要更新现有的GroupLocation记录。

我相信,一旦你正确地实现了这一点,你就能摆脱attr_accessible,我认为这不应该是必要的。

有关涵盖大部分内容的嵌套属性功能的详细信息,请查看this page

答案 1 :(得分:0)

实际答案是必须可以通过attr_accessible访问嵌套属性。如果附带“attr_accessible:group_locations”,“accepts_nested_attributes”将只执行我想要的操作。