ruby-on-rails - 具有祖先的 Rails 复杂搜索

标签 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::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 的产品。但是观察表总是只包含 2 级类别(系列)的 category_id,我需要能够通过品牌(1 级类别)搜索产品。我如何构建这种类型的查询?谢谢!

最佳答案

好吧,我看到有人对我的旧问题投赞成票,所以我会回答。我使用原始 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

希望这对某人有所帮助。

关于ruby-on-rails - 具有祖先的 Rails 复杂搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6813969/

相关文章:

ruby-on-rails - Rails 中的二维码生成器

ruby-on-rails - 用于 rails ERB 模板的空白去除器?

ruby-on-rails - 工厂机器人 : create the same object multiple times

c# - 将数据从 XML 文件导入到 SQL 数据库

database - 将 gc_grace_seconds 10 更改为 0 天后,Cassandra 上的主要压缩

在 COBOL 中搜索和搜索所有内容

ruby-on-rails - 规范;如何测试这个功能?

php - 如果存在 mysqli php 则编辑重复项

ios - Firebase Swift - 当搜索 Controller 过滤结果时,实时更新不起作用

objective-c - PDF专搜iOS