В рельсах, как я могу извлечь объект на ассоциацию ACOS_TO, не проходя через базу данных?
-
01-10-2019 - |
Вопрос
Рассмотрим следующую настройку:
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) (P), потому что мне нужен доступ к значению родителей quey_attr, который еще не хранится в базе данных. Есть ли способ сделать это? C.parent (force_reload = false) не доставляет меня туда.
Решение
Вы можете использовать: Inverse_of, чтобы установить его. Подробнее об этом здесь.
Другие советы
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)
(«Не перезагрузить из БД»), сделает здесь хитрость, так как это свежий дочерний объект. Но вы тоже можете попробовать это тоже.