7

関連する2つのレールモデルがあります

class Location < ActiveRecord::Base
  has_many :rates
  geocoded_by ....
end

class Rate < ActiveRecord::Base
 belongs_to :location
end

私はジオコーダーの宝石を使用しています - http://www.rubygeocoder.com

pairユーザーから特定の距離内にある特定の属性を持つすべての料金を検索したいと考えています。

SQL では、レートに対して内部結合を実行します。

SELECT * FROM rates INNER JOIN locations ON rates.location_id=locations.id;

次に、ペア属性でフィルタリングする where 条件を挿入し、結果のテーブルで Geocoder の near メソッドを使用します (near メソッドは、場所の緯度と経度の属性を使用して距離を計算するクエリに where 条件を挿入することで機能します)。適切な距離内の行のみを選択する

レールでこれを行うにはどうすればよいですか? 私は試した

rates = Rate.joins(:locations)

私は得る

ActiveRecord::ConfigurationError: Association named 'locations' was not found; perhaps you misspelled it?

やりたい

rates = Rate.joins(:locations).near(my_latitude, my_longitude, distance).where(:rates => {:pair => 'xxxx'})

しかし、私は得る

undefined method `near' for #<ActiveRecord::Relation:0xa075ff8>
4

2 に答える 2

9
near = Location.near(location, radius)
Rate.includes(:location).references(:location).merge(near)

これは、他の Location または Rate スコープと連鎖可能です

于 2014-06-12T18:35:41.150 に答える
3

私はこれが古いものであることを知っていますが、まだ答えられていません。どこにもありません:)

私は同じ問題に遭遇し、ジオコーダーのドキュメントの奥深くにある小さな情報に出くわしました。そこでは、外部結合を機能させるために (レールではインクルードで行われます)、結合を次と組み合わせて使用​​する必要があると書かれていました。選択すると、それでうまくいきました(特定の場所にいるユーザーからすべての製品を見つける必要がありました)。

だから私の頭の上から、これはあなたの場合にうまくいくかもしれません:

rates = Location.near(my_latitude, my_longitude, distance, :select => "rates.*").joins(:locations).where(:rates => {:pair => 'xxxx'})

これが役立つことを願っています。

于 2013-07-29T21:56:36.287 に答える