命名空间模型上的ActiveRecord查询方法

时间:2013-07-08 18:38:04

标签: ruby-on-rails ruby activerecord

我有一组通用的模型被提取到具有命名空间模型的gem中:

module Gemifive
  class Activity < ActiveRecord::Base
    belongs_to :user
  end

  class User < ActiveRecord::Base
    has_many :activities
  end
end

那是宝石中的“宝石”。到目前为止,非常好。

在我使用此gem模型的应用程序中,我可以执行以下操作:Gemifive::Activity.where(user_id: user.id)。这样可以正常工作,因为该表格有一个user_id列:

SELECT "gemifive_activities".* FROM "gemifive_activities" WHERE "gemifive_activities"."user_id" = 18`

但是,以下工作:Gemifive::Activity.where(user: user)。这会生成以下SQL,该SQL无效:

SELECT "gemifive_activities".* FROM "gemifive_activities" WHERE "gemifive_activities"."user" = 18

我可以访问Gemifive::Activity.first.user就好了,所以我知道belongs_to协会正在运作。为什么我不能使用这个ActiveRecord约定?

1 个答案:

答案 0 :(得分:3)

Gemifive::Activity.where(user: user)

这是无效的ARel,简单明了。它与您的模型被命名空间无关。在上面的代码中,ARel使用Hash的密钥作为列名,并且将逐字使用。您可以做的是

Gemifive::Activity.where(user_id: user)