Хотя я никогда раньше не видел этого исключения ActiveScaffold, я думаю, что именно так и происходит:
Обратная связь установлена с помощью опции :inverse_of
, и ее эффекты будут виднытолько пока записи не сохранены.Вот почему вы не видите этого в своем эксперименте с консолью.
Попробуйте:
place = Place.new
=> #<Place ...>
producer = place.producers.build
=> #<Producer ...>
producer.place
=> nil
place.producers.first.place
=> nil
Эти записи не пройдут проверку, если они полностью встроены в память.Если вы никогда не строите место и продюсера одновременно, вам не нужно беспокоиться об этом.Однако, если вы это сделаете, то ваше правило проверки также должно быть написано для проверки существования :place
(то есть объекта), а не :place_id
:
validates_presence_of :place
Я не знаю, какая сборка/ механизм создания, используемый ActiveScaffold, но я предполагаю, что если они сгенерируют это исключение, они могут создавать объекты в памяти.
Итак, чтобы это исправить, попробуйте:
class Producer < ActiveRecord::Base
belongs_to :place, inverse_of: producers
validates_presence_of :place
end
class Place < ActiveRecord::Base
has_many :producers, inverse_of: place
end
Примечание:ActiveRecord раньше не поддерживал :inverse_of
на стороне has_many
, и это ограничение раньше комментировалось в источнике.Начиная с Rails 3.1 это кажется исправленным.Если вы измените свои классы с помощью :inverse_of
, как показано, то консольный эксперимент с объектами в памяти должен вернуть связанный объект.
Возможно, вы захотите просмотреть документы Rails API по двунаправленным ассоциациям