考虑以下设置:

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)不会让我到达那里。

有帮助吗?

解决方案

您可以使用:inverse_of将其设置。阅读更多有关它的信息 这里.

其他提示

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) (“不要从DB中重新加载”)在这里将解决问题,因为它是一个新鲜的孩子。但是您也可以尝试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top