5

2 つのモデルがLocationあり、 pg_searchジオコーダーBasicgemを使用しています。ジオコーダーメソッドを使用してスコープを追加するにはどうすればよいですか?pg_search_scope near

Locationモデルには緯度と経度の列があります。

私のコントローラーでは、これを行うことができます:

# this allows me to search near the Location model
@business = Location.near(params[:loc], 15)

# this searches through the pg_search_scope
@term = Basic.search(params[:q])

#I'm trying to combine @business and @term

そしてBasicモデルで私はこれを持っています:

pg_search_scope :search, :against => [:first_name, :last_name], 
  :associated_against => {
    :services => [:service, :description]
  },
  :using => {
    :tsearch => {:disctionary => "english" }
  }

@business両方を@term1つにまとめたいの(@search)ですが可能ですか?

ありがとう

++++++++++++++++

だから私のBasicモデルでは:

class Basic < ActiveRecord::Base
  belongs_to :location

  has_many :services, as: :servicable

  pg_search_scope :search, :against => [:first_name, :last_name], 
    :associated_against => {
      :services => [:service, :description]
    },
    :using => {
      :tsearch => {:disctionary => "english" }
    }

end

したがって、私のモデルでは、基本にリンクされているサービスがあります。そのため、名前またはサービスの結果を検索すると、ポップアップが表示されます。しかし、ユーザーが入力した特定の場所の近くにのみ結果を表示しようとしています。そのため、テーブルにlocation_id列があります。Basic

これは私のLocationモデルです

class Location < ActiveRecord::Base
  has_many :basics
  geocoded_by :new_address
  after_validation :geocode, :if => :new_address_changed?
  def gmaps4rails_address
    :new_address
  end
  def new_address_changed?
    attrs = %w(street city state)
    attrs.any?{|a| send "#{a}_changed?"}
  end  
end

だから私はメソッドを連鎖させようとしています。理想的には、アプリケーションは最初に近くのすべての結果を検索し、次に近くの結果内で一致する用語を検索して、適用可能なものだけを表示します。

4

1 に答える 1

0

あなたが望むLocationのは、近くにあり、用語に一致するparams[:loc]に関連付けられている のようです。その解釈が間違っていれば、残りのすべてが間違っているでしょう。Basicparams[:q]

純粋にデータベースでこれを行うには、スコープによって追加された条件を使用してテーブルをおよびlocationsによって追加された条件を使用してテーブルに結合する必要があります。残念ながら、他のテーブルへの任意の結合で使用する方法が見つからないため、これに対する単純なクエリベースのソリューションはわかりません。しかし、結果が比較的小さい場合は、結合を Ruby で実行できます。コントローラーコードの後:nearbasicsservicespg_search_scopepg_search_scope@business@term

@matching_businesses = @business & @term.map(&:location)

これを行う方法は他にもありますが、アイデアは、結果内のものと結果内の に関連付けられたもののLocation間で一意の のセットを見つけることです。より明確に読める別の方法を次に示します。@businessBasic@term

@matching_businesses = @business.select do |business|
  @term.any? { |basic| business.basics.include?(basic) }
end

十分なパフォーマンスが得られない場合は、おそらく独自のクエリを作成するか、pg_search_scope実装を読んで、任意の結合をサポートする方法を理解する必要があります。

于 2013-12-31T17:45:19.997 に答える