Альтернативный метод для proxy_owner в ActiveRecord

ActiveRecord proxy_owner теперь устарел, и здесь очень расплывчатое объяснение того, как его изменить, поэтому я не уверен, как его использовать в моем случае: http://apidock.com/rails/ActiveRecord/Associations/AssociationProxy

Вот что я пытаюсь сделать:

class Library < ActiveRecord::Base
  has_many :books do
    def some_method
      proxy_owner.author
    end
  end
end

Когда я запускаю этот код, я получаю предупреждение о том, что proxy_owner устарел:

DEPRECATION WARNING: Calling record.books.proxy_owner is deprecated. Please use record.association(:books).owner instead.

Я могу заменить proxy_owner.author на:

@associaton.owner.author

Это работает; однако это кажется опасным. Я что-то упустил?


person Jeff    schedule 09.08.2011    source источник


Ответы (1)


Я думаю, что безопаснее вместо этого отправить :owner на proxy_association:

class Library < ActiveRecord::Base
  has_many :books do
    def some_method
      proxy_association.owner.author
    end
  end
end

Использование proxy_association теперь упоминается в документации:

Однако внутри фактического кода расширения у вас не будет доступа к записи (record.association (: items) .owner), как указано выше. В этом случае вы можете получить доступ к proxy_association. Например, record.association (: items) и record.items.proxy_association вернут один и тот же объект, что позволит вам выполнять вызовы, такие как proxy_association.owner, внутри расширений ассоциации.

person Dave Nolan    schedule 09.09.2011
comment
Я тоже этого ожидал, но, похоже, это не сработало. Я получаю ошибку неопределенного метода proxy_association. - person Wolfram Arnold; 29.10.2011
comment
Предыдущий комментарий относится к Rails 3.0. proxy_owner подходит для Rails 3.0. Однако он устарел в Rails 3.1, а в Rails 3.1 ответ Дэйва Нолана правильный. - person Wolfram Arnold; 29.10.2011