所以说我有这个:
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
如何进行有效的查询,使所有拥有至少一个Tree
或Flower
实例或两者的Fruit
实例得到?这个想法不是让Tree
和Flower
完全没有的Fruit
。
答案 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)
一种非常基本的方法来获取所有至少具有一个Tree
或Flower
的{{1}},就像这样
Fruit
然后是您想要的flowers = Flower.pluck(:tree_id)
fruits = Tree.pluck(:tree_id)
Tree
这将导致对数据库的3个查询,根据您的用例,这可能是问题,也可能不是问题。
一种更高级的方法是执行此操作,这只会导致一个查询。请注意,使用Tree.where(id: [flowers, fruits].flatten)
而非select
可以使Rails最后只发出一个查询。
pluck