2

3 モデル:

Class Product
 include Mongoid::Document
 has_many :orders, dependent: :destroy, :autosave => true
 #search
 searchable do
  text :title, :description, :boost => 2.0
  time :created_at
 end
end

Class Order
 include Mongoid::Document
 belongs_to :product
 has_one :dispute, dependent: :destroy, :autosave => true
end

Class Dispute
 include Mongoid::Document
 belongs_to :order
 field :buyer_has_requested_refund, :type => Boolean, :default => "false"
end

私はアクションの内部を必要products_controller.rbindexし、注文のあるすべての製品を上位から下位に取得して並べ替え、紛争がありますbuyer_has_requested_refund = true

何かのようなもの:

def index
 @search = Product.solr_search do |s|
 s.fulltext params[:search]
 s.keywords params[:search]
 s.order_by :disputes_where_buyer_has_requested_refund, :desc
 end
 @products = @search.results
    respond_to do |format|
    format.html # index.html.erb
  end 
end

ありがとうございました!

4

1 に答える 1

0

検索のソートに必要な情報をインデックス化するように solr に指示する必要があります。

class Product
 include Mongoid::Document
 has_many :orders, dependent: :destroy, :autosave => true
 has_many :disputes, :through => :orders
 #search
 searchable do
  text :title, :description, :boost => 2.0
  integer :disputes_where_buyer_has_requested_refund { |product| product.disputes.where(:buyer_has_requested_refund => true).size }
  time :created_at
 end
end

新しい紛争が作成/破棄された場合は、それに応じてインデックス内のレコード値を再インデックスすることに注意してください。遅延ジョブで after_create/after_destroy フックを使用してこれを行うか、ニーズとインデックスのサイズに応じて 1 日 1 回インデックスを再作成することもできます。

于 2012-12-11T19:49:25.900 に答える