2010-01-12 2 views
1

У меня есть приложение rails (работает на версии 2.2.2), которое имеет модель под названием Product. Продукт находится в отношениях has-and-to-many с Feature. Проблема в том, что мне нужны функции поиска для продуктов. Поэтому мне нужно иметь возможность искать продукты с похожим именем и некоторые другие атрибуты. Сложная часть состоит в том, что поиск должен также возвращать продукты, которые имеют точный набор функций, указанных в форме поиска (это представлено связкой флажков). Следующий код работает, но он поражает меня как весьма неэффективно:Построение запроса has-and-of-many

@products = Product.find(:all, :conditions=>["home=? AND name LIKE ? AND made_by LIKE ? AND supplier LIKE ? AND ins LIKE ?",hme,'%'+opts[0]+'%','%'+opts[1]+'%','%'+opts[3]+'%','%'+opts[4]+'%']) 


#see if any of these products have the correct features 
if !params[:feature_ids].nil? 
    f = params[:feature_ids].collect{|i| i.to_i} 
    @products.delete_if {|x| x.feature_ids!=f} 
end 

Я сожалею, что мой обхват рельсов/SQL настолько слаб, но есть ли какой-либо предложения о том, как улучшить приведенный выше код? Спасибо!

+0

И еще одно: если мой ответ помог вам, пожалуйста, отметьте его в качестве ответа на ваш вопрос (зеленая галочка) :) 10qu –

ответ

1

Во-первых, я бы порекомендовал вам вручную написать модель FeatureProduct (а не использовать «has_and_belongs_to_many» по умолчанию) EG

class FeatureProduct 
    belongs_to :feature 
    belongs_to :product 
end 

class Product 
    has_many :feature_products 
    has_many :features, :through => :feature_products 
end 

class Feature 
    has_many :feature_products 
    has_many :products, :through => :feature_products 
end 

Для поиска: Вы можете найти драгоценный камень SearchLogic быть именно то, что вы необходимость. Он поддерживает условия «LIKE» (это означает, что вы можете написать более «Rails» ваш запрос). Он также поддерживает выполнение поиска с условиями на соответствующей модели (точнее, на вашей модели функций).

решение было бы что-то вроде:

search = Product.search 
search.name_like = opt[0] 
search.made_by_like = opt[1] 
... 
search.feature_products_id_equals = your_feature_ids 
.. 
@product_list = search.all 

Существует также excellent screencast объяснение использования этого драгоценного камня.

Удачи :)

+0

Спасибо! Я действительно посмотрел в SearchLogic, и это выглядело отлично. Однако, по-видимому, это не очень хорошо работает с моей версией рельсов (которых мне не разрешено обновлять). Ваш ответ был очень полезен, но я все еще разбираюсь в канатах здесь, поэтому извините, мне потребовалось столько времени, чтобы щелкнуть стрелку. – Anna

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