2011-07-25 110 views
3

复杂的搜索我有以下模式设置轨与祖先

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 - 系列。现在IM建立这种类型的搜索查询与meta_search宝石

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

这个工程的帮助下,用serie_name返回所有产品。但是手表总是只包含2级分类(serie)的category_id,而im需要能够通过make(1级分类)搜索产品。我如何构建这种类型的查询?谢谢!

回答

0

那么,我看到一些upvotes来我的老问题,所以我会回答。我使用原始的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 

希望这可以帮助别人。