В направляющих, как я могу получить объект на belongs_to ассоциации, не проходя базу данных?

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

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) не получает меня там.

5
задан KenB 30 June 2010 в 19:56
поделиться

1 ответ

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

1
ответ дан 14 December 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: