考虑以下设置:
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正在查询父对象的数据库。我想要访问现有的内存中对象(p),因为我需要访问父的some_attr值,该值尚未存储在数据库中。有没有办法做到这一点? c.parent(force_reload = false)不会让我在那里。
答案 0 :(得分:5)
您可以使用:inverse_of来设置它。阅读更多相关信息here。
答案 1 :(得分:1)
ActiveRecord不会努力保证相同数据库对象的内存中对象都是相同的。这是DataMapper确实保证的。
我意识到你的例子可能是简化的,以便提出你的问题,但只是从一个天真的看看它 - 你为什么不用p而不是c.parent?
另一个可能有用的建议,将更新保存到db:
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对象。但你也可以尝试一下。