6

I know that this will be an easy one but I'm having real issues working it out.

I have users that can have_many results. I'm trying to work out how to return users that don't yet have any results to the @starters object(from the controller).

@users = @event.entires

@starters = @users.where("results = ?", 0)

could anyone explain how i would check if a user has no results?

4

4 回答 4

14

最佳解决方案(正如 Yoshiji 先生评论的那样)

@starters = @users.includes(:results).where(results: { id: nil })

这将执行与我的第二个解决方案中的查询相同的查询。

其他 SQL 解决方案

你可以使用一个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为您的“用户”模型的名称。

其他 Ruby 解决方案

@starters = @users.select { |u| !!u.results }

这里!!将强制转换为布尔值,如果没有resultsu.results将返回[](空数组)。和!![]等于true

于 2013-10-03T20:38:45.107 回答
0

尝试左加入并找到哪个为空

@users.joins("LEFT OUTER JOIN user ON user.id = result.user_id").where("result.id IS NULL")
于 2013-10-03T20:27:00.917 回答
0

如果您@users是数组,请尝试:

@starters = @users.select { |u| u.results.empty? }
于 2013-10-03T20:28:02.080 回答
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)")
于 2013-10-03T20:34:39.270 回答