1

現在のセットアップでは、一部のデータを Tire Gem でスコープするカスタム SQL ステートメントを追加する必要があります。

Ruby 1.9.3でRails 3.2を使用しています

リストコントローラーには、次のものがあります。

@listings = Listing.search()

私の Listing.rb では、次のような多数のフィルターを使用して検索方法を使用しています。

def self.search(params={})
    tire.search(load: true, page: params[:page], per_page: 50) do |search|
      search.query  { string params[:query], :default_operator => "AND" } if params[:query].present?
      search.filter :range, posted_at: {lte: DateTime.now}
      search.filter :term, "property.rooms_available"   => params[:property_rooms_available]  if params[:property_rooms_available].present?
      search.filter :term, "property.user_state"        => params[:property_user_state]       if params[:property_user_state].present?
  
   ...
end

私がする必要があるのは、この SQL ステートメントを search メソッドに追加して、経度と緯度でスコープを設定することです。「座標」は、URL のパラメーターによって次の形式で渡されます。

http://localhost:3000/listings?coords=51.0000,-01.0000 52.0000,-02.0000 

(-01.0000 と 52.0000 の間に空白があります。)

現在私は持っています:

 sql = "SELECT title, properties.id, properties.lng,properties.lat from listings WHERE ST_Within(ST_GeometryFromText('POINT(' || lat || ' ' || lng || ')'),ST_GeometryFromText('POLYGON((#{coords}))'));"

私はこのようなものでコントローラ内でそれをスコープしようと考えましたか?

def self.polyed(coords)
    joins(:property).
    where("ST_Within(ST_GeometryFromText('POINT(' || properties.lat || ' ' || properties.lng || ')'),ST_GeometryFromText('POLYGON((#{coords}))'))").
    select("title, properties.id, properties.lng,properties.lat")
end

この...

listings_controller.rb

def index
  @listings = Listing.polyed(poly_coordinates).search()
end

結果を HTML および json 形式で @listings として返す必要があります。

http://localhost:3000/listings.json?

私はすでにRABLを使用してjsonを自動的に生成しています。

これは可能ですか?

よろしくお願いします。

ライアン

4

1 に答える 1

0

joins1 つの可能性は、オプションで options 、whereなどを渡すこと:loadです。

しかし、返された結果を Rails コードでフィルタリングしたい場合は、Tire を使用してレコード ID のみをロードし (fields返されるフィールドを制限するオプションを使用)、それらを SQL クエリで使用する方がはるかに優れているようです。

于 2012-12-12T20:58:07.597 に答える