Как удалить объекты через именованную область?
Существует таблица соединения с тремя столбцами: 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
,