Cześć,
mam 3 modele:
- Product (
has_many :property_products
,has_many :properties, through: :property_products
) - Property
- PropertyProduct
Przykładowe rekordy:
Product id:1, name: 'Sukienka'
Property id: 1, name: 'Rozmiar'
Property id: 2, name: 'Kolor'
PropertyProduct id: 1, product_id: 1, property_id: 1, value: 'S'
PropertyProduct id: 2, product_id: 1, property_id: 2, value: 'green'
Chciałbym zrobić wyszukiwarkę, która wyszuka produkty z wieloma parametrami, np.
property_id = 1, value = 'S'
property_id = 2, value = 'green'
Pytałem już na Stacku, ale jedyna odpowiedź jaką dostałem to:
product_ids = ActiveRecord::Base.connection.execute('
select product_id, count(product_id)
from property_products
where (property_id = 1 AND value = 'S')
OR (property_id = 2 AND value = 'green')
GROUP BY product_id
HAVING count(product_id) = 2')
.map { |i| i['product_id'] }
products = Product.where(id: product_ids)
zwraca to co chciałem, ale nie jest to najładniejsze rozwiązanie. Dałoby się to jakoś lepiej zrobić?
EDIT:
znalazłem rozwiązanie, może komuś się przyda:
Product.joins('join property_products as p1 on products.id=p1.product_id')
.joins('join property_products as p2 on products.id=p2.product_id')
.where('p1.value = 'S' AND p1.property_id = 1')
.where('p2.value = 'green' AND p2.property_id = 2')