0

我有 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

4

2 回答 2

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返回的每个游戏对象提供一个参数。

于 2013-02-06T20:13:31.780 回答
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

对不起,如果我误解了你

于 2013-02-07T04:41:56.817 回答