2013-04-26 2 views
4

Вот мои классы:Fetch записи, где все связанные записи имеют атрибут

class Product < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :products 
end 

Категория имеет visible booloean.

Мне нужно создать область в Product, так что я могу получить все продукты, какие категории являются все Запись видна (т.е. если продукт имеет 10 категорий, и даже одна категория имеет visible значение ЛОЖЬ, объем должен отказаться от продукта).

Оба вызова ActiveRecord и запросы MySQL приемлемы.

EDIT: у нас есть сотни тысяч продуктов, и нам нужно будет делегировать эти операции в базу данных, так как нам придется делать разбиение на страницы, сортируя понравившиеся на этом массиве продуктов.

ответ

0

Вы можете найти все продукты, которые имеют: видимые как false.Then минус это из всех продуктов. Product.all - Product.where('categories.visible=?', false).includes(:category)

+0

Спасибо. Интересно, не нужно ли делегировать вычитание массива Ruby? У нас есть сотни тысяч продуктов. Например, такой расчет, вероятно, будет катастрофой, поскольку нам, например, понадобится разбиение на страницы. – amencarini

1
Product.where("id not in (select product_id from categories where visible='false')") 

Надеется, что это помогает.

+0

Спасибо, но это не работает: во-первых, 'categories' не имеет столбец' category_id'; во-вторых, если есть Продукт с идентификатором 2, а Категория с видимым установленным значением false и id 2, даже если Продукт не связан с категорией, он будет исключен. – amencarini

Смежные вопросы