рельсы сложный поиск с родословной - PullRequest
3 голосов
/ 25 июля 2011

У меня есть следующие настройки модели

class Category < ActiveRecord::Base

  has_ancestry :cache_depth => true, :depth_cache_column => :depth

  has_many :watches, :dependent => :destroy
  has_many :products, :through => :watches
end

class Watch < ActiveRecord::Base

  belongs_to :category
  has_many :products
end

class Product < ActiveRecord::Base

  belongs_to :watch, :counter_cache => true
  belongs_to :category
end

Мне нужно найти товары по названию категории. Категория имеет 2 уровня глубины (древовидная структура). 1 - уровень - это марка, 2 - серия. Сейчас я строю этот тип поискового запроса с помощью meta_search gem

@products = (Product.search :watch_category_name_contains => params[:search]).all.paginate(:page => params[:page])

Это работает и возвращает все продукты с serie_name. Но таблица просмотра всегда содержит только category_id категории 2 уровня (серия), и я должен иметь возможность искать товары по маркам (категория 1 уровня). Как я могу построить этот тип запроса? Спасибо!

1 Ответ

0 голосов
/ 24 января 2012

Что ж, я вижу, что по моему старому вопросу появилось несколько голосов, поэтому я отвечу. Я заканчиваю с сырым sql для марок и серийных запросов. Вот оно:

  def self.makes_with_products
    find_by_sql "
SELECT makes.* FROM categories makes
WHERE ancestry IS NULL AND makes.id IN (
    SELECT series.ancestry FROM products p
    INNER JOIN watches w ON w.id = p.watch_id
    INNER JOIN categories series ON series.id = w.category_id
    WHERE series.ancestry = makes.id AND p.active
  )
"
  end

  def series_with_products
   find_by_sql "
SELECT series.* FROM categories series
WHERE series.ancestry = '#{id}'
  AND (
    SELECT COUNT(*) FROM products p
    INNER JOIN watches w ON w.id = p.watch_id
    WHERE w.category_id = series.id AND p.active
  ) > 0
"
  end

Надеюсь, это кому-нибудь поможет.

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