Построение запроса «есть и принадлежит многим» - PullRequest
1 голос
/ 12 января 2010

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

@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

Извините, что мое понимание rails / sql настолько слабое, но есть ли у кого-нибудь какие-либо предложения о том, как улучшить приведенный выше код? Большое спасибо!

1 Ответ

1 голос
/ 13 января 2010

Во-первых, я бы порекомендовал вам написать модель 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 way» ваш запрос). Также имеется поддержка для выполнения поиска с условиями в связанной модели (точнее, в вашей функциональной модели).

Решение будет что-то вроде:

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

Существует также превосходный скринкаст , объясняющий использование этого драгоценного камня.

Удачи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...