因此,我有两个关联的模型“用户”和“杂志”。它们通过订阅通过has_many:through关系关联。所以这是它的样子:
class User < ActiveRecord::Base
has_many :subscriptions
has_many :magazines, :through => :subscriptions
end
class Subscription < ActiveRecord::Base
belongs_to :user
belongs_to :magazine
end
class Magazine < ActiveRecord::Base
has_many :subscriptions
has_many :users, :through => :subscriptions
end
用户具有名为的布尔属性paid
。我只希望用户在哪里paid == true
可以订阅任何杂志。我如何建立这样的条件关联?在此先感谢您的帮助!
对于关联,您可以在哈希选项之前传递一个lambda值。在此lambda中,您可以指定条件,顺序等。
class Magazine < ActiveRecord::Base
has_many :subscriptions
has_many :users, ->{ where(users: {paid: true}) }, through: :subscriptions
end
对于用户,您可以执行以下操作:
class User < ActiveRecord::Base
has_many :subscriptions
has_many :magazines, through: :subscriptions
def magazines
self.paid ? super : Magazine.none
end
end
虽然很整洁,但是在连接表时,上面的行为可能无法预测,例如,User.joins(:magazines)
可能会忽略paid
条件或崩溃。
更好的选择:
class User < ActiveRecord::Base
has_many :subscriptions
has_many :magazines,
->{ where("subscriptions.user_id IN (
SELECT id FROM users WHERE users.paid = 't')") },
through: :subscriptions
end
这where
在lambda可能是由可替换的joins
,如下所示:
joins(subscriptions: :user).where(users: {paid: true})
但我认为这将加入subscriptions
两次-一次参加lambda,一次参加协会。我不确定。如果是这样,并且这使您感到困扰,那么:
joins("INNER JOIN users ON (users.id = subscriptions.user_id)").
where(users: {paid: true})
或者:
joins("INNER JOIN users ON (
(users.id = subscriptions.user_id) AND (users.paid = 't')
)")
另外,我认为您将Subscription
模型误贴为Registration
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句