我有一对班级:
class Collection < ActiveRecord::Base
has_many :items, autosave: true
end
class Item < ActiveRecord::Base
belongs_to :collection
end
Run Code Online (Sandbox Code Playgroud)
来自文档:
当:autosave为true时,无论是否为新记录,都会保存所有子项:
但是当我更新Item并保存其父级时Collection,Item不会保存已升级的属性:
> c = Collection.first
=> #<Collection id: 1, name: "collection", created_at: "2012-07-23 00:00:10", updated_at: "2012-07-23 00:00:10">
> i = c.items.first
=> #<Item id: 1, collection_id: 1, name: "item1", created_at: "2012-07-23 00:00:25", updated_at: "2012-07-23 00:00:25">
> i.name = 'new name'
=> "new name"
> c.save
=> true
> Collection.first.items
=> [#<Item id: 1, collection_id: 1, name: "item1", created_at: "2012-07-23 00:00:25", updated_at: "2012-07-23 00:00:25">]
Run Code Online (Sandbox Code Playgroud)
那么,我错过了什么?
我正在使用Rails 3.2.5和Ruby 1.9.2.
所以我在ActiveRecord的源代码中做了一些挖掘.我们可以掌握c自动保存关联:
> c.class.reflect_on_all_autosave_associations
=> [#<ActiveRecord::Reflection::AssociationReflection:0x007fece57b3bd8 @macro=:has_many, @name=:items, @options={:autosave=>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>]
Run Code Online (Sandbox Code Playgroud)
我认为这表明该协会已经建立了自动保护.
然后我们可以得到对应的关联实例c:
> a = c.send :association_instance_get, :items
=> #<ActiveRecord::Associations::HasManyAssociation:0x007fece738e920 @target=[#<Item id: 1, collection_id: 1, name: "item1", created_at: "2012-07-23 00:00:25", updated_at: "2012-07-23 00:00:25">], @reflection=#<ActiveRecord::Reflection::AssociationReflection:0x007fece57b3bd8 @macro=:has_many, @name=:items, @options={:autosave=>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=#<Collection id: 1, name: "collection", created_at: "2012-07-23 00:00:10", updated_at: "2012-07-23 00:00:10">, @updated=false, @loaded=true, @association_scope=[#<Item id: 1, collection_id: 1, name: "item1", created_at: "2012-07-23 00:00:25", updated_at: "2012-07-23 00:00:25">], @proxy=[#<Item id: 1, collection_id: 1, name: "item1", created_at: "2012-07-23 00:00:25", updated_at: "2012-07-23 00:00:25">], @stale_state=nil>
Run Code Online (Sandbox Code Playgroud)
然后,我们可以找到通过此关联关联的实际对象:
> a.target
=> [#<Item id: 1, collection_id: 1, name: "item1", created_at: "2012-07-23 00:00:25", updated_at: "2012-07-23 00:00:25">]
Run Code Online (Sandbox Code Playgroud)
这里找到的对象没有我之前做的更新.
Tom*_*ose 13
这里的问题是这条线
i = c.items.first
Run Code Online (Sandbox Code Playgroud)
此行从数据库中提取正确的项目,但不将其附加到集合c.它是一个与物体不同的红宝石物体
i = c.items[0]
Run Code Online (Sandbox Code Playgroud)
如果您用第二行替换第一行,您的示例将起作用.
| 归档时间: |
|
| 查看次数: |
2579 次 |
| 最近记录: |