【发布时间】:2015-06-29 13:49:47
【问题描述】:
我有两个模型:owner 和 pet。主人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
这是我的数据库中的内容。我有三个所有者:
- 尼尔,以及所有这些都是沉重的;
- John,以及所有这些都不重;
- Bob,他的一些宠物很重和一些不重。
查询应该只返回 Neil。现在我的尝试返回 Neil 和 Bob。
【问题讨论】:
-
我发现在 Rails 查询中确定诸如 为什么我得到该结果 之类的最有用的资源很简单。尝试致电
Owner.heavy_pets.to_sql,这应该会让您很好地了解原因。如下所示,添加uniq或distinct应该将结果集限制为您想要的。 -
从描述中看不清楚您感兴趣的查询。你想要这样的东西吗?
Owner.only_if_they_have_heavy_pets? -
@MariusPop 是的。只抓住拥有所有重型宠物的所有者。所以如果一个主人有 50 只宠物,而其中只有一只不重,那就不要抓住那个主人。如果一个主人有 50 只宠物,并且他的 50 只宠物都很重,那么抓住那个主人。
-
而且,顺便说一句:我只想抓住那些拥有所有体重超过 30 磅的宠物的主人 - 你只想要重型狗。 尼尔,所有这些都不重。然后你写,你想归还尼尔。这是一个拼写错误,而您想要 John 吗?
-
您使用的是哪个 RDBMS?还有,哪个 Rails 版本?
标签: sql ruby-on-rails ruby activerecord rails-activerecord