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

时间:2013-09-08 21:29:25

标签: ruby-on-rails named-scope findby activerecord-relation

有一个包含三列的联接表: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包含在哪一列。如何编写一个尊重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中返回的所有产品?

1 个答案:

答案 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}}。