我有3个简单的模型:
class User < ActiveRecord::Base
has_many :subscriptions
end
class Game < ActiveRecord::Base
has_many :subscriptions
end
class Subscription < ActiveRecord::Base
belongs_to :user
belongs_to :game
end
我想知道的是,当我查询游戏时,是否有可能包含另一个名为'is_subbed'的属性,该属性将包含特定用户订阅游戏?类似的东西:
a_user = User.first
games = Game.scoped
games.conditions blah blah blah
游戏将包含一个'虚拟'或内存属性,该属性将自定义为a_user,称为is_subed
答案 0 :(得分:2)
您可以创建类方法和实例方法(对于单个游戏),如下所示:
class Game < ActiveRecord::Base
def self.subscribed?(user)
joins(:subscriptions).where(subscriptions: { user_id: user.id}).exists?
end
def subscribed?(user)
subscriptions.where(user_id: user.id).exists?
end
end
要使用查询API为每个游戏获取此结果,您可以执行以下操作:
scope :with_subscriptions, lambda do |user|
joins("LEFT JOIN subscriptions ON subscriptions.game_id = games.id AND subscriptions.user_id = #{user.id}")
select("games.*, CASE WHEN subscriptions.user_id IS NULL THEN true ELSE false END as is_subscribed")
end
这将为您返回的每个游戏对象提供is_subscribed
参数。
答案 1 :(得分:0)
如果我没弄错的话,你需要获得某些用户订阅的游戏并在这些游戏中应用一些范围吗? 可能这种方式是可以接受的
# extend user model with games collection
class User < ActiveRecord::Base
# your code
has_many :games, through: :subscriptions
end
然后在控制器(或任何你需要的地方)打电话
@user.games.your_games_scope1.your_games_scope2.etc
对不起,如果我误解了你