has_one методы ассоциации выполняются непоследовательно для меня, и я не знаю почему.Rails: почему методы 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.first.super не дают тот же результат, когда контейнер == Container.first?
Вы пробовали вызов 'save' на экземпляр, созданный 'build_super'? Вероятно, почему Container.first.super не найден. Кроме того, я знаю, что это _probably_ не проблема здесь, но супер является зарезервированным словом и может вызвать некоторое безумие. – struthersneil
Что происходит, так это то, что 'container.super' имеет ссылку на объект, который вы только что создали в ассоциации, даже если он не сохранен. 'Container.first.super' должен фактически выполнить чтение. – struthersneil