从关联的模型(表)中查找具有至少一个关联的所有记录

时间:2020-09-07 09:11:27

标签: ruby-on-rails model rails-activerecord

所以说我有这个:

class Tree < ActiveRecord::Base
  has_many :fruits
  has_many :flowers
end

class Fruit < ActiveRecord::Base
  belongs_to :tree
end

class Flower < ActiveRecord::Base
  belongs_to :tree
end

如何进行有效的查询,使所有拥有至少一个TreeFlower实例或两者的Fruit实例得到?这个想法不是让TreeFlower完全没有的Fruit

2 个答案:

答案 0 :(得分:3)

我会使用这样的查询:

Tree.left_joins(:fruits, :flowers).where('fruits.id IS NOT NULL OR flowers.id IS NOT NULL').distinct

它将生成此SQL:

SELECT DISTINCT "trees".* FROM "trees" LEFT OUTER JOIN "fruits" ON "fruits"."tree_id" = "trees"."id" LEFT OUTER JOIN "flowers" ON "flowers"."tree_id" = "trees"."id" WHERE (fruits.id IS NOT NULL OR flowers.id IS NOT NULL)

答案 1 :(得分:0)

一种非常基本的方法来获取所有至少具有一个TreeFlower的{​​{1}},就像这样

Fruit

然后是您想要的flowers = Flower.pluck(:tree_id) fruits = Tree.pluck(:tree_id)

Tree

这将导致对数据库的3个查询,根据您的用例,这可能是问题,也可能不是问题。


一种更高级的方法是执行此操作,这只会导致一个查询。请注意,使用Tree.where(id: [flowers, fruits].flatten) 而非select可以使Rails最后只发出一个查询。

pluck