has_many返回一个数组而不是ActiveRecord类

时间:2011-06-02 18:52:48

标签: ruby-on-rails-3 has-many railscasts

我正在关注OmniAuth railscasts并尝试使用authlogic + facebook实现相同的功能,而不是像railscast中所示的设计+ twitter。

也许我对has_many的理解仍然不好,但在railscast中,ryan在AuthenticationsController

中有following code
  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 个答案:

答案 0 :(得分:5)

该数组实际上是一个AssociationProxy实例,它将所有方法调用委托给内部对象,在has_many关联的情况下这是一个数组(另见this question)。这意味着你应该可以调用像find_or_create_by_provider_and_uid这样的魔术方法,以及范围等等。

我发现了这个问题,因为我偶然发现了类似的问题:由于某些原因,我无法调用ActiveRecord::Relation#klass来查找模型类:

post.comments.klass # => NoMethodError

但首先调用relation可以获得正常的ActiveRecord::Relation实例:

post.comments.relation.klass # => Comment