我有一组通用的模型被提取到具有命名空间模型的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约定?
答案 0 :(得分:3)
Gemifive::Activity.where(user: user)
这是无效的ARel,简单明了。它与您的模型被命名空间无关。在上面的代码中,ARel使用Hash的密钥作为列名,并且将逐字使用。您可以做的是
Gemifive::Activity.where(user_id: user)