sql - ActiveRecord:如果其中至少有一条记录不符合条件,则排除组

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

我有两个模型:ownerpet。一个主人 has_many :pets 和一只宠物 belongs_to :owner

我想做的是只捕获那些拥有所有重量超过 30 磅 宠物的主人

#app/models/owner.rb
class Owner < ActiveRecord::Base
  has_many :pets
  #return only those owners that have heavy pets
end

#app/models/pet.rb
class Pet < ActiveRecord::Base
  belongs_to :owner
  scope :heavy, ->{ where(["weight > ?", 30])}
end

这是我的数据库中的内容。我有三个所有者:

  1. Neil所有这些都很重
  2. John所有这些都不重
  3. Bob他的一些宠物很重一些不重

查询应该只返回 Neil。现在我的尝试返回 NeilBob

最佳答案

您可以为每个 owner_id 组成一个组并检查,如果组中的所有行都符合要求的条件或者至少有一行不符合它,您可以实现它带有 group byhaving 子句:

scope :heavy, -> { group("owner_id").having(["count(case when weight <= ? then weight end) = 0", 30]) }

还有另一种选择,更多的是 Rails-ActiveRecord 方法:

scope :heavy, -> { where.not(owner_id: Pet.where(["weight <= ?", 30]).distinct.pluck(:owner_id)).distinct }

在这里你得到所有不符合条件的 owner_id(矛盾搜索),并将它们从原始查询的结果中排除。

关于sql - ActiveRecord:如果其中至少有一条记录不符合条件,则排除组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31117435/

相关文章:

mysql - SQL - 两个表的 WHERE 和 JOIN 之间的区别

ruby-on-rails - 不知道如何建立任务 'db:create'

mysql - 如何使用日期时间列在一天中的某个时间后获取行

mysql - 如何多次连接表以获取交易中每种类型的计数

ruby-on-rails - 使用 capistrano 部署 "zero downtime"后, unicorn worker 超时

ruby-on-rails - 从头开始标记 : the Tag Cloud Issue

ruby - 加载时显示 ruby​​ 文件的完整路径名

ruby - Make Coderay (in Pry) 高亮评论

ruby - 如何使用 Highrise Ruby gem 添加一个人?

sql - 提取最后一次出现字符之前的字符串