has_many возвращает массив вместо класса ActiveRecord - PullRequest
6 голосов
/ 02 июня 2011

Я следую OmniAuth railscasts и пытаюсь реализовать то же самое с authlogic + facebook вместо devise + twitter, как показано в railscast.

Возможно, мое понимание has_many все еще не очень хорошо, но в Railscasts у Райана есть следующий код в AuthenticationsController

  def create
    auth = request.env["rack.auth"]
    current_user.authentications.find_or_create_by_provider_and_uid(auth['provider'], auth['uid'])
    flash[:notice] = "Authentication successful."
    redirect_to authentications_url
  end

В моей реализации current_user.authentications возвращает массив [] как я могу вызвать find_or_create_by_provider_and_uid для массива?

Моя реализация неверна? has_many не должен ли возвращать массив?

Ошибка, которую я получаю, заключается в том, что я звоню find_or_create_by_provider_and_uid на nil объект.

current_user.authentications - ноль, потому что у пользователя еще нет аутентификаций.

1 Ответ

5 голосов
/ 20 января 2012

Массив на самом деле является экземпляром AssociationProxy, который делегирует все вызовы методов внутреннему объекту, который является массивом в случае has_many ассоциации (см. Также этот вопрос ).Это означает, что вы должны быть в состоянии вызывать магические методы, такие как find_or_create_by_provider_and_uid, а также области видимости и т. Д., На этом отлично.

Я нашел этот вопрос, потому что наткнулся на похожую проблему: по какой-то причине я не смогпозвоните ActiveRecord::Relation#klass, чтобы узнать класс модели:

post.comments.klass # => NoMethodError

Но, позвонив сначала relation, вы можете получить обычный ActiveRecord::Relation экземпляр:

post.comments.relation.klass # => Comment
...