【问题标题】:Use associated model scope使用关联的模型范围
【发布时间】:2015-10-08 23:08:31
【问题描述】:

如果我有一个名为User 的模型has_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)"

这不是我想要的。我错过了什么?

【问题讨论】:

  • 错误是什么,生成的 SQL 查询是什么样的?
  • 添加了生成的 SQL - 它不会出错,但它只是没有返回我所期望的。

标签: ruby-on-rails activerecord


【解决方案1】:

我想你正在寻找

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

要查看 sql,请尝试从 rails 控制台运行以下命令:

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'}) }

【讨论】:

  • 合并没有做我想要的。这是它执行的 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 = 'declined' WHERE (games.user_id IS NULL)"
猜你喜欢
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多