这个问题与此有关:thinking-sphinx index minimum
我有三种模式:Product
,Price
,PriceType
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
我试着这样做,但没有运气(注释掉)。
答案 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设置。但是,如果这种情况并不常见,并且不是太多,那么这是一个可行的解决方案。