【问题标题】:rails how to find with no associated recordsrails如何在没有关联记录的情况下查找
【发布时间】:2013-10-03 20:17:21
【问题描述】:

我知道这将是一件容易的事,但我在解决它时遇到了真正的问题。

我的用户可以有_many 结果。我正在尝试研究如何将还没有任何结果的用户返回给@starters 对象(来自控制器)。

@users = @event.entires

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

谁能解释我将如何检查用户是否没有结果?

【问题讨论】:

  • results 是用户的属性吗?
  • 只保留 SQL-away:@starters = @users.includes(:results).where(results: { id: nil }) 这将适用于任何类型的数据库

标签: ruby-on-rails controller associations


【解决方案1】:

最佳解决方案(正如 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

【讨论】:

  • 太棒了——这是一种享受。我选择了第一个解决方案,但我玩得很开心!
【解决方案2】:

尝试左连接并找出哪个为空

@users.joins("LEFT OUTER JOIN user ON user.id = result.user_id").where("result.id IS NULL")

【讨论】:

    【解决方案3】:

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

    @starters = @users.select { |u| u.results.empty? }
    

    【讨论】:

      【解决方案4】:

      这应该得到所有没有任何结果的用户:

      @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)")
      

      【讨论】:

        猜你喜欢
        • 2014-12-08
        • 2011-07-16
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        相关资源
        最近更新 更多