2017-06-20 12 views
0

私のRailsアプリケーションでは、HealthcareCenterと呼ばれるテーブルがあります。複数のOrder by Railsを適用する方法

私は、以下の注文に基づいてヘルスケアセンターをリストしたいと思います(ページごとに50レコードをリストする必要があります)。

  1. recommentations数(ユーザがログインした場合)
  2. 評価(最初の高い評価)
  3. 距離(最初の設定距離は< 25キロ、25と100との間の第2の距離、第三の任意の距離が、昇順でなければなりません)

私は、画像の下による説明します

enter image description here

0123画像で

我々はcurrenly私はので、このクエリは、(私に高い評価と診療所のリストを与える私は

HealthcareCenter.where("healthcare_centers.name LIKE ?", "%#{query}%") 
         .where(type_id: type_id) 
         .order("healthcare_centers.overall_rating DESC") 
         .calculate_distance2a(lat, lon)     
         .order("distance") 
         .order("healthcare_centers.name") 
         .offset(offset) 
         .limit(limit) 

def self.calculate_distance2a(orig_lat, orig_lon, dist = nil) 
    lat1, lon1, lat2, lon2 = the_square(orig_lat, orig_lon, dist) 
    self.select(" healthcare_centers.id, 
     ROUND(
     6371 * 2 * ASIN (SQRT (
      POWER(SIN((#{orig_lat} - healthcare_centers.latitude)*pi()/180/2),2) 
      + COS(#{orig_lat} * pi()/180) 
      * COS(healthcare_centers.latitude *pi()/180) 
      * POWER(SIN((#{orig_lon} - healthcare_centers.longitude) *pi()/180/2), 2) 
    )),2) as distance" 
    ) 
    .where("healthcare_centers.longitude between #{lon1} and #{lon2}") 
    .where("healthcare_centers.latitude between #{lat1} and #{lat2}") 
    .order("distance") 
end 

を書かれている

clicnicsを注文すべき画像のSQLに示す5つの診療所、などを見ることができますチェックユーザーは、それらの距離コンディを含める方法を超える25キロは

あなたは上の私を導いてくださいすることができ、高い評価を持っているので、私のDBにログインしている)が、最初の結果

として私よりも大きい25キロを与えませんン

1)< = 25

2)> 25 & & < = 100

3)> 100(以下25キロ我々は2を持っている場合

は検討)ASC順序でなければなりませんClicnics.Clinic A 4.3(評価)、2Kmの距離、Clinic B 3(評価)、評価に基づく1.5km Clinic Aは上にリストする必要があります。

+0

私はトリックを行う必要がありレーティングその後、第一の距離で注文すると思う列の別名として距離を計算する必要があります。.. '.ORDER(「距離ASC、healthcare_centers.overall_rating DESC」)' –

+0

私たちは25KM未満であれば2 Clicnics.Clinic A 4.3(評価)、2Kmの距離、Clinic B 3(評価)、1.5kmの評価に基づいてクリニックAは上にリストする必要があります。最初に。それは間違った@Mdです。ファハンメモン – vinothini

答えて

1

あなたはその後、

HealthcareCenter.where("healthcare_centers.name LIKE ?", "%#{query}%") 
        .where(type_id: type_id) 
        .order("healthcare_centers.overall_rating DESC, 
          distance, 
          healthcare_centers.name") 
+0

申し訳ありませんもっと詳しく説明してください – vinothini

+0

距離の距離条件を列エイリアスとして含める方法 – vinothini

+0

選択すると、名前付き距離で計算列を作成する必要があります – scaisEdge

関連する問題