:在has_many关系上忽略了自动保存 – 我错过了什么?
我有一对class级:
class Collection < ActiveRecord::Base has_many :items, autosave: true end class Item < ActiveRecord::Base belongs_to :collection end
来自文档 :
当:autosave为true时,无论是否为新记录,都会保存所有子项:
但是当我更新一个Item
并保存其父Collection
, Item
的upated属性不会被保存:
> c = Collection.first => # > i = c.items.first => # > i.name = 'new name' => "new name" > c.save => true > Collection.first.items => [#]
那么,我错过了什么?
我正在使用Rails 3.2.5和Ruby 1.9.2。
所以我在ActiveRecord的源代码中做了一些挖掘。 我们可以掌握c
的自动保存关联:
> c.class.reflect_on_all_autosave_associations => [#true, :extend=>[]}, @active_record=Collection(id: integer, name: string, created_at: datetime, updated_at: datetime), @plural_name="items", @collection=true, @class_name="Item", @klass=Item(id: integer, collection_id: integer, name: string, created_at: datetime, updated_at: datetime), @foreign_key="collection_id", @active_record_primary_key="id", @type=nil>]
我认为这表明该协会已经设立了自动保存。
然后我们可以获得与c
对应的关联实例:
> a = c.send :association_instance_get, :items => #<ActiveRecord::Associations::HasManyAssociation:0x007fece738e920 @target=[#], @reflection=#true, :extend=>[]}, @active_record=Collection(id: integer, name: string, created_at: datetime, updated_at: datetime), @plural_name="items", @collection=true, @class_name="Item", @klass=Item(id: integer, collection_id: integer, name: string, created_at: datetime, updated_at: datetime), @foreign_key="collection_id", @active_record_primary_key="id", @type=nil>, @owner=#, @updated=false, @loaded=true, @association_scope=[#], @proxy=[#], @stale_state=nil>
然后,我们可以找到通过此关联关联的实际对象:
> a.target => [#]
这里找到的对象没有我之前做过的更新。
这里的问题是这条线
i = c.items.first
此行从数据库中提取正确的项目,但不将其附加到集合c。 它是一个与物体不同的ruby物体
i = c.items[0]
如果您用第二行替换第一行,您的示例将起作用。