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

StackOverflow https://stackoverflow.com/questions/3152924

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top