Рассмотрите следующую установку:
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) не получает меня там.
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)
(«не перезагружать из базы данных») поможет здесь, поскольку это свежий Дочерний объект. Но вы тоже можете попробовать это.