Wyszukiwanie rekordów posiadających wiele parametrów


#1

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')

#2

możesz zrobić przekazanie parametrów do modelu i porównanie ich lub w samym kontrolerzy… pokaż kod na githubie najlepiej. np coś w ten desen

Def porownanie x = nil
a = Product.all
if (self.name=a.name). present?

end


#3

Ale że co, masz Produkt, który ma wiele property_poroducts i co dalej?