5

考虑以下设置:

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belongs_to :parent
end

这个控制台会话:

>> p = Parent.find 41
>> p.some_attr = 'some_value'
>> c = p.children.build
>> c.parent

通过查看我的日志文件,我可以看到 c.parent 正在查询 db 中的父对象。我想访问现有的内存中对象 (p),因为我需要访问父级的 some_attr 值,该值尚未存储在数据库中。有没有办法做到这一点?c.parent(force_reload=false) 没有让我到达那里。

4

2 回答 2

5

你可以使用 :inverse_of 来设置它。在此处阅读更多相关信息。

于 2010-08-26T02:59:59.583 回答
1

ActiveRecord 并不努力保证相同数据库对象的内存对象都是相同的。这是 DataMapper 所保证的。

我意识到你的例子可能是为了问你的问题而简化的,但只是从一个天真的角度来看——你为什么不直接使用 p 而不是 c.parent 呢?

另一个可能有用的建议,将更新保存到父数据库:

p = Parent.find 41

# do this...
p.some_attr = 'some_value'
p.save

# OR this...
p.update_attribute(:some_attr, 'some_value')

c = p.children.build
c.parent

我不确定c.parent(false)(“不要从数据库重新加载”)是否会在这里解决问题,因为它是一个新的 Child 对象。但你也可以试试。

于 2010-06-30T20:13:19.530 回答