有一个包含三列的联接表:id
,product_a_id
,product_b_id
class ProductConnection < ActiveRecord::Base
belongs_to :product_a, class_name: :Product
belongs_to :product_b, class_name: :Product
end
我想按特定产品过滤表格,无论产品ID包含在哪一列。如何编写一个尊重product
可以nil
的命名范围?以下草稿的灵感来自a post by Zack Holman,但不的工作:
scope :find_by_product, \
lambda {|p| p.nil? ? { \
where(["product_a_id = ? OR product_b_id = ?", p.id, p.id]) : {} \
}
然后我想知道如何删除 ActiveRecord::Relation
中返回的所有产品?
答案 0 :(得分:1)
听起来问题是当传入的产品为零时如何使find_by_product
范围有效?我认为你的花括号有点混乱。无论哪种方式,这都是我如何写它以防万一:
ProductConnection
scope :for_product, ->(product) {
if product_id = product.try(:id)
where(arel_table[:product_a_id].eq(product_id).
or(arel_table[:product_b_id].eq(produt_id))
end
}
然后,一旦有效,你可以在范围内调用destroy_all来销毁所有记录。
ProductConnection.for_product(my_product).destroy_all
还有delete_all,如果你真的不希望destroy
包含ActiveRecord回调,你也可以使用{{3}}。