Почему ActiveRecord не может присвоить объект атрибуту ассоциации? - PullRequest
2 голосов
/ 26 сентября 2010

Я потратил половину рабочего дня, пытаясь отследить это в AR. С учетом настройки модели, например:

class Publication < ActiveRecord::Base
  has_many :subscriptions
end

class Subscription < ActiveRecord::Base
  belongs_to :publication
  belongs_to :user
end

В контроллере,

  @new_subscription = publication.subscriptions.create( user: @current_user ) { |r| ... }

Отлично работает в режиме разработки при первом запуске после запуска сервера. Второй раз, однако, выдает ошибку от

~/.rvm/gems/ruby-1.9.1-p378/gems/activerecord-2.3.8/lib/active_record/base.rb:2906:in `block in assign_attributes':
ActiveRecord::UnknownAttributeError: unknown attribute: user

Настройка

config.cache_classes = true

в config/environments/development.cfg устраняет проблему.

Где AR обрабатывает создание attr_accessor / writer для belongs_to ассоциации, и почему это сработало в первый, а не во второй раз? Похоже, метод доступа не определяется, когда класс выгружается и перезагружается между запросами? Дополнительная информация: Publication и Subscription используют STI, и ассоциации определены в базовых классах, если это не должно иметь никакого значения. Это ruby ​​1.9.1 и Rails / AR 2.3.8

Благодарен за любые подсказки.

Ответы [ 2 ]

1 голос
/ 26 сентября 2010

Попробуйте использовать nested_attributes .

0 голосов
/ 08 октября 2010

Ах, «работает первый раз в режиме разработки», но не при последующих перезагрузках страницы.Возможно, связано с Lighthouse # 1339: https://rails.lighthouseapp.com/projects/8994/tickets/1339-arbase-should-not-be-nuking-its-children-just-because-it-lost-interest Запуск с cache_classes = true "исправляет" его или этот патч в режиме разработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...