Ruby on rails 带有祖先的rails复杂搜索

Ruby on rails 带有祖先的rails复杂搜索,ruby-on-rails,database,search,activerecord,Ruby On Rails,Database,Search,Activerecord,我有以下模型设置 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

我有以下模型设置

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

此功能可用于返回所有带有serie_名称的产品。但观察表始终只包含2级类别(系列)的类别id,im需要能够通过makes(1级类别)搜索产品。如何构建这种类型的查询?谢谢

好吧,我看到一些关于我的老问题的投票,所以我会回答。Im使用原始sql完成Make和series查询。这是:

  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
希望这能帮助别人

  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