如何通过命名范围删除对象



有一个包含三列的连接表:idproduct_a_idproduct_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 中,您可以以相同的方式使用它。

相关内容

  • 没有找到相关文章

最新更新