我知道这将是一个简单的问题,但我正在解决这个问题。
我的用户可以拥有多个结果。我正在尝试找出如何将尚未获得任何结果的用户返回@starters对象(来自控制器)。
@users = @event.entires
@starters = @users.where("results = ?", 0)
任何人都可以解释我如何检查用户是否没有结果?
答案 0 :(得分:12)
@starters = @users.includes(:results).where(results: { id: nil })
这将执行与我的第二个解决方案中的查询相同的查询。
您可以使用LEFT OUTER JOIN
。这样,你将始终拥有“左”表(users
)的所有结果,但是你也会有“右”表(results
)的匹配记录,尽管有非,这将是留下你可以查看的空白字段。
@starters = @users.joins("LEFT OUTER JOIN results ON results.user_id = users.id").where("results.user_id IS NULL")
在您的情况下,将users
替换为“用户”模型的名称。
@starters = @users.select { |u| !!u.results }
此处!!
将强制转换为布尔值,如果没有results
,u.results
将返回[]
(空数组)。 !![]
等于true
。
答案 1 :(得分:0)
尝试左连接并找到哪一个为空
@users.joins("LEFT OUTER JOIN user ON user.id = result.user_id").where("result.id IS NULL")
答案 2 :(得分:0)
如果您的@users
是数组,请尝试:
@starters = @users.select { |u| u.results.empty? }
答案 3 :(得分:0)
这应该让所有没有任何结果的用户得到:
@starters = ActiveRecord::Base.execute("select * from users where id not in (select user_id from results)")
另一种方法是:
User.where("id not in ?", "(select user_id from results)")