ActiveRecord自定义属性

时间:2013-02-06 20:10:22

标签: ruby-on-rails ruby rails-activerecord

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

2 个答案:

答案 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

对不起,如果我误解了你