2011-11-04 22 views
0

どうすればこのようなクエリを実行できますか? 私はRailsのアクティブレコードクエリ

@model = Model.near([latitude, longitude], 6.8) 

は、今私は上記1に関連付けられている別のモデルを、フィルタリングする必要があります。 (これを行うための正しい方法を得ることで私を助けて)

model2 = Model2.where("model_id == :one_of_the_models_filtered_above", {:one_of_the_models_filtered_above => only_from_the_models_filtered_above}) 

model.rbは今それがこの

has_many :model2s 

ようmodel2.rb

belongs_to :model 

だろうこのように(@model = Model.nearの後([緯度、経度]、6.8)

model2s =[] 
models.each do |model| 
    model.model2s.each do |model2| 
     model2.push(model2) 
    end 
end 
代わりに、私は同じことを達成したい

が、アクティブレコードクエリと

私が何かを見つけたと思う、なぜこれが

Model2.where("model.distance_from([:latitude,:longitude]) < :dist", {:latitude => latitude, :longitude => longitude, :dist => 6.8}) 

を失敗しないこのクエリは

SQLite3::SQLException: near "(": syntax error: SELECT "tags".* FROM "tags" WHERE (model.distance_from([43.45101666666667,-80.49773333333333]) < 6.8) 
このエラーがスローされます

、理由

+0

で "IN"節を使用できますか? Model2.where( "model_id in?"、@models) 'と似ています。 2番目の部分では、distance_fromに配列を渡そうとしていますか? distance_fromメソッドを呼び出す代わりに、クエリで使用できる値を含む属性をモデルに含めることはできますか? – aishwarya

+1

SQLiteのSQLの風味に 'distance_from'を実装するか、それを実装するためのユーザ定義関数を追加する必要があります。 –

+1

'join 'を使用して、モデルのクエリで一致するすべてのModel2オブジェクトを選択できます –

答えて

0

includesです。それは、関連モデルを熱心にロードする(N + 1ではなく2つのSQLクエリ)。あなたが@models.first.model2sを行いますとき

@models = Model.near([latitude, longitude], 6.8).includes(:model2s) 

ので、関連するmodel2sはすでに(詳細はRoR guidesを参照してください)ロードされます。

あなたがモデルのあなたのコレクションに属するすべてのmodel2sの配列を取得したい場合は、あなたが行うことができます:

@models.collect(&:model2s) 
# add .flatten at the end of the chain if you want a one level deep array 
# add .uniq at the end of the chain if you don't want duplicates 

collectを(もmap呼ばれる)の配列にに渡された任意のブロックの結果を収集します各呼び出し元の要素(これはコードとまったく同じです。詳しくはEnumerable's docを参照してください)。シンボル前&は、コレクションの各要素に渡さProcに変換し、これは

@models.collect {|model| model.model2s } 

もう一つの書き込みと同じです:@muは権利であるが、SQLiteのは、保存されているdistance_fromについて知らないようです手順。これはGISに関連する疑問ですが、この特定の問題については、最初のビットについてはgis.stackexchange.com

関連する問題