有一个包含三列的连接表: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 包含在哪一列中。如何编写一个尊重可以nil
product
的命名范围?以下草稿的灵感来自Zack Holman的一篇文章,尽管它不起作用:
scope :find_by_product,
lambda {|p| p.nil? ? {
where(["product_a_id = ? OR product_b_id = ?", p.id, p.id]) : {}
}
然后我想知道如何删除ActiveRecord::Relation
中返回的所有产品?
听起来问题在于当传入的产品为零时如何使您的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,如果您真的不希望 ActiveRecord 回调包含在 destroy
中,您可以以相同的方式使用它。