2015-10-08 53 views
0

如果我有一个模型Userhas_many :games和游戏has_many :events - 我如何获得没有任何游戏的所有用户或任何有暂停事件的游戏。使用关联的模型范围

这是我曾尝试:

例子:

用户等级:

scope :with_no_games -> { 
    joins("LEFT OUTER JOIN games g on g.user_id = users.id").where("games.id IS NULL") 
} 

scope :with_suspended_games_or_no_games -> { 
    with_no_games.merge(Game.suspended) # <- this doesn't work 
} 

游戏类:

scope :suspended -> { 
    joins("INNER JOIN events e ON event.game_id = games.id AND event.name = 'suspended'") 
} 

如果我跑User.with_suspended_games_or_no_games我得到下面的SQL声明:

SELECT \"users\".* FROM \"users\" LEFT OUTER JOIN games ON games.user_id = users.id INNER JOIN events ON events.game_id = games.id AND events.name = 'suspended' WHERE (games.user_id IS NULL)"

这不是我正在寻找的。我错过了什么?

+0

什么是错误,是什么生成的SQL查询样子? – max

+0

添加生成的SQL - 它不会出错,但它不会返回我所期望的。 –

回答

0

我认为你正在寻找

scope :with_suspended_games_or_no_games -> { 
    with_no_games.joins(:games).merge(Game.suspended) 
} 

查看SQL尝试运行从铁轨控制台以下:

User.with_suspended_games_or_no_games.to_sql 

奖金

你也可以写你的范围如:

用户

scope :with_no_games -> { joins(:games).where(games: {id: nil}) } 
scope :with_suspended_games_or_no_games -> { joins(:games).with_no_games.merge(Game.suspended) } 

游戏

scope :suspended -> { joins(:events).where(events: {name: 'suspended'}) } 
+0

合并不是我想要的。这里是它的SQL: '“SELECT \”users \“。* FROM \”users \“左外部连接游戏ON games.user_id = users.id INNER JOIN事件ON events.game_id = games.id AND events .name ='rejected'WHERE(games.user_id IS NULL)“' –