【问题标题】:Rails: get parent records having ZERO has_many associationsRails:获取具有零 has_many 关联的父记录
【发布时间】:2014-09-11 16:45:48
【问题描述】:

这是我的联想:

class User < ActiveRecord::Base
  has_many :tickets
end

class Ticket < ActiveRecord::Base
  belongs_to :user
end

非常简单。我想要一个 User 模型上的范围,它返回所有具有完全零关联票证的用户。

目前我大部分时间都在使用 Ruby 来完成它:

def self.never_flown
  results = []
  find_each do |user|
    results << user if user.tickets.count == 0
  end
  results
end

... 这很糟糕,因为这对 Ruby 来说不是一个好的用例。但我正在努力弄清楚如何使用 SQL 来做到这一点。

有人可以告诉我一个好的、干净的 SQL 解决方案吗?!

【问题讨论】:

    标签: sql ruby-on-rails ruby activerecord ruby-on-rails-4


    【解决方案1】:

    可能类似于:User.includes(:tickets).where(tickets: {user_id: nil})

    在一个范围内,它就像:without_tickets, -&gt; { includes(:tickets).where(tickets: {user_id: nil}) }

    【讨论】:

      【解决方案2】:

      可以使用 SQL 子查询,这可能比使用 includes() 更有效:

      User.where('id not in (select user_id from tickets)')
      

      【讨论】:

      • 这也有效,但我选择了上面的答案,因为它可以说更清楚。但是,我想对两者进行基准测试,并确认哪个表现更好。
      【解决方案3】:

      你也可以这样做:

      User.joins("LEFT OUTER JOIN orders ON orders.user_id = users.id WHERE orders.user_id IS NULL")
      

      虽然@oliver-roset 的方法对于以后阅读您的代码的人来说更简单易懂。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-17
        • 1970-01-01
        相关资源
        最近更新 更多