В Rails, как я могу получить объект в ассоциации own_to, не проходя через базу данных? - PullRequest
5 голосов
/ 30 июня 2010

Рассмотрим следующую настройку:

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) не доставит меня туда.

Ответы [ 2 ]

5 голосов
/ 26 августа 2010

Вы можете использовать: inverse_of, чтобы установить его. Подробнее об этом здесь .

1 голос
/ 01 июля 2010

ActiveRecord не стремится гарантировать, что объекты в памяти для одних и тех же объектов базы данных будут одинаковыми. Это то, что DataMapper действительно гарантирует.

Я понимаю, что ваш пример, вероятно, упрощен для того, чтобы задать ваш вопрос, но просто из наивного взгляда на него - почему бы вам просто не использовать p вместо c.parent?

Еще одно, возможно, полезное предложение, сохраните обновление в 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. Но вы можете попробовать это тоже.

...