Как удалить объекты через именованную область?

Существует таблица соединения с тремя столбцами: 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

Я хотел бы отфильтровать таблицу по конкретному продукту независимо от того, в каком столбце содержится идентификатор продукта. Как я могу написать именованную область, которая учитывает, что product может быть nil? Следующий черновик вдохновлен постом Зака ​​Холмана, хотя он не работает:

scope :find_by_product, \
  lambda {|p| p.nil? ? { \
    where(["product_a_id = ? OR product_b_id = ?", p.id, p.id]) : {} \
  }

Тогда я хотел бы знать, как я могу удалить все продукты, возвращенные в ActiveRecord::Relation?

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, который вы можете использовать таким же образом, если вы действительно не хотите, чтобы обратные вызовы ActiveRecord включались в destroy,

Другие вопросы по тегам