2013-09-08 2 views
0

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

Похоже, проблема связана с тем, как работать с областью 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.

+0

Если это сработает для вас, я с удовольствием расскажу больше о синтаксисе, используемом при необходимости. – pdobb

+0

Выглядит неплохо, однако он возвращает все записи таблицы соединений, когда я передаю «nil» в область. – JJD

+0

@JJD, что бы вы хотели, чтобы его возвращали при передаче «nil» в область видимости? При передаче 'nil' вы хотели бы, чтобы он возвращал все, где' product_a_id' 'nil' или' product_b_id' является 'nil'? Если это так, удалите 'if' adn' end' (сохраняя 'product_id = product.try (: id)'. Тогда, если 'product' является' nil', локальный var 'product_id' будет' nil' и остальное должно быть само собой разумеющимся. – pdobb