在我的项目中,我使用closure_tree
-gem,并希望在Product
模型上编写自定义方法,该方法返回给定集合的所有父对象。
我试着写课堂方法:
class Product < ActiveRecord::Base
has_closure_tree
def self.tree_parents
root_product_ids = []
all.each do |product|
root_product_ids << (product.root? ? product.id : product.parent_id)
end
Product.where(id: root_product_ids)
end
end
返回关系正在与以前的关系合并,但我需要这种方法来返回绝对新的独立ActiveRecord::Relation
:
» leaf_product = Product.where(id: 219)
Product Load (0.7ms) SELECT "products".* FROM "products" WHERE "products"."deleted_at" IS NULL AND "products"."id" = 219
=> #<ActiveRecord::Relation [#<Product id: 219, name: ... ]>
» leaf_product.tree_parents
Product Load (1.0ms) SELECT "products".* FROM "products" WHERE "products"."deleted_at" IS NULL AND "products"."id" = 219
Product Load (0.7ms) SELECT "products".* FROM "products" WHERE "products"."deleted_at" IS NULL AND "products"."id" = 219 AND "products"."id" IN (1)
=> #<ActiveRecord::Relation []>
简而言之,我希望此方法只返回Product.where(id: root_product_ids)
,而不将其与Product.where(id: 219)
链接。
如何返回只包含IN
语句而不包含父关系WHERE id ...
语句的新关系?
不太确定你在做什么,但听起来你正在寻找一种无范围的方法:
Product.unscoped.where(id: product_ids)