2017-11-21 3 views
1

でジオコーダの並べ替えを使用した場合の簡素化ORのRuby on Railsでの条件文私のようないくつかのコードを持っています@sort_byの場合は条件付きです。距離や他のフィールド

基本的には、モデル上の地理的距離(ジオコーダーの宝石によって強化された)または 'opportunity_date'フィールドでソートするオプションをユーザーに与えています。また、このコードをrails 5.0を使用して単純化できるかどうかを知りたい。注:ジオコーダーはレールORMにモデルの.distanceフィールドを提供しますが、データベース自体にはありません。

答えて

0

条件付きで条件条件を追加し、orderをプログラムで.nearに設定することで、これを行うことができます。ような何か:

query = Opportunity.upcoming_unsorted 
    .is_geocoded 
    .near([@query_location.latitude, @query_location.longitude], MilesRadius, order: @sort_by == 'distance') 
query = query.order('opportunity_date') if @sort_by != 'distance' 
query.paginate(page: @page, per_page: PerPage) 
0

アダムの答えはあなたのために働くかもしれないが、私のために、私は実際に私も追加するために必要な、より複雑なクエリ(OR条件を使用して)を有していました。

通常、私たちがここでやろうとしているようなことを達成するには、arel_tableを使用します。このシナリオでは、ジオコーダーの「近い」メソッドがarel互換ではないため、できません(これが当てはまらない場合はお知らせください)。

このように、私がやったことは、引き続き2つのクエリと条件付きを使用していたことです。私はレコードのIDを収集し、次に別のクエリでソート/ページ処理を行いました。 (私は、コードのクリーンアップのために最適化しようとしていましたが、必ずしもクエリ効率ではありませんでした)