Методы ассоциации has_one выполняются у меня непоследовательно, и я не знаю, почему.
Возьмем две простые модели, связанные друг с другом:
class Container < ActiveRecord::Base
has_one: :super
end
class Super < ActiveRecord::Base
belongs_to: :container
end
Следующий код работает как надо:
container = Container.create
...
container.build_super
...
=> #<Super id: nil, container_id: 1, content: nil, created_at: nil, updated_at: nil>
container.super
=> #<Super id: nil, container_id: 1, content: nil, created_at: nil, updated_at: nil>
Когда вы вызываете container.super в приведенном выше коде, он возвращает только что созданный экземпляр класса Super.
Однако следующий код не работает:
Container.create
...
=> #<Container id: 1, created_at: "2013-10-26 20:31:26", updated_at: "2013-10-26 20:31:26">
Container.first.build_super
...
=> #<Super id: nil, container_id: 1, content: nil, created_at: nil, updated_at: nil>
Container.first.super
Container Load (0.2ms) SELECT "containers".* FROM "containers" ORDER BY "containers"."id" ASC LIMIT 1
Super Load (0.1ms) SELECT "supers".* FROM "supers" WHERE "supers"."container_id" = ? ORDER BY "supers"."id" ASC LIMIT 1 [["container_id", 1]]
=> nil
Container.first.super возвращает ноль, потому что он ищет экземпляр Super в базе данных. Однако экземпляр еще не зафиксирован.
Но почему container.super и Container.first.super не дают одинакового результата, когда container == Container.first?
save
для экземпляра, созданногоbuild_super
? Вероятно, поэтому Container.first.super не найден. Кроме того, я знаю, что вероятно это не проблема, но слово "супер" зарезервировано и может вызвать некоторое сумасшествие. - person struthersneil   schedule 27.10.2013container.super
имеет ссылку на объект, который вы только что создали в ассоциации, даже если он не сохранен.Container.first.super
должен фактически выполнить чтение. - person struthersneil   schedule 27.10.2013