think-sphinx过滤器由has_many关联

时间:2014-04-21 06:36:26

标签: ruby-on-rails ruby postgresql thinking-sphinx

这个问题与此有关:thinking-sphinx index minimum

我有三种模式:ProductPricePriceType

class Product < ActiveRecord::Base
  has_many :prices

class Price
  belongs_to :product
  belongs_to :price_type

  validates :price_type, :value, :product, presence: true
  validates :price_type, uniqueness: { scope: :product }

class PriceType
  has_many :prices

产品has_many价格(某些用户类型的某些价格,因此有price_type值)。一种产品对某些price_type具有独特的价格。

我需要按价格值和price_type进行过滤和排序。

如果没有这种价格类型的价格,应该用另一种价格类型的价格代替(我应该通过价格类型ID)。

ThinkingSphinx::Index.define :product, with: :active_record do
  indexes name
  indexes k1c
  indexes catalogue_code
  indexes created_at, sortable: true

  # sort by price
  has prices.id, as: :price_ids
  has prices.price_type_id, as: :price_type_ids
#  PriceType.all.each do |price_type|
#    has "prices.value(CASE WHEN prices.type_id = #{price_type.id} END)", as: "price_type_#{price_type.id}".to_sym, type: :float
#  end

  has :category_id
  has :brand_id
  has :kind_cd
end

我试着这样做,但没有运气(注释掉)。

1 个答案:

答案 0 :(得分:1)

这在聊天室中进行了讨论,我们通过在索引定义中添加以下内容,找出了适用于按特定价格类型的价格进行排序的解决方案:

PriceType.all.each do |price_type|
  has "(CASE WHEN prices_#{price_type.id} IS NOT NULL THEN prices_#{price_type.id}.value ELSE NULL END)", as: "price_type_#{price_type.id}".to_sym, type: :float
  join "LEFT OUTER JOIN prices AS prices_#{price_type.id} ON prices_#{price_type.id}.product_id = products.id AND prices_#{price_type.id}.price_type_id = #{price_type.id}"
  group_by "price_type_#{price_type.id}"
end

从性能角度来看,这并不是特别理想 - 每次将新的PriceType添加到系统时,都需要重建Sphinx设置。但是,如果这种情况并不常见,并且不是太多,那么这是一个可行的解决方案。