2013-02-06 113 views
0

我有3個簡單的模型:ActiveRecord的自定義屬性

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

你可以讓一個類的方法和實例方法(單場)像這樣:

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參數。

+0

是的,我知道這一點,但我需要成爲大量的作用域條件的一部分,並通過json在一個查詢中返回 – 0xSina

+0

如果我做了games.to_json並傳入方法,它將生成n個查詢更多... – 0xSina

+0

@ 0xSina:'games.subscribed?(用戶)'會根據if返回true或false用戶訂閱任何遊戲。它將在一個查詢中執行此操作。你在尋找不同的結果嗎?也許你的意思是如果用戶訂閱了每個遊戲都會返回? – PinnyM

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 

很抱歉,如果我誤解你