2 つの ActiveRecord モデルがあります。Idea
とUser
。のように機能する 2 つの関連付けがありUser.idea
ます。
User モデルは現在保存され、ユーザーlat
からlng
調整されます。
アイデア コントローラーから、特定の場所に一致するすべてのアイデアをクエリしたいと思います。Rails でこの逆結合クエリを実行する方法がわかりません。
2 つの ActiveRecord モデルがあります。Idea
とUser
。のように機能する 2 つの関連付けがありUser.idea
ます。
User モデルは現在保存され、ユーザーlat
からlng
調整されます。
アイデア コントローラーから、特定の場所に一致するすべてのアイデアをクエリしたいと思います。Rails でこの逆結合クエリを実行する方法がわかりません。
私はあなたがこれを望んでいると思います:
Idea.joins(:user).where(user: {lat: some_lat, lng: some_lng}).all
some_lat
/some_lng
範囲にすることができます。Railsが魔法を処理します。
最初に: 希望の場所をどのように見つけますか? おそらく、Geocoder のようなものを使用できます ( RailsCastがあります)。
近い将来、同様の問題が発生する可能性がありますが、現時点では、おそらく2つのステップで実行すると思います(ダブルクエリ):
@users = User.near(params[:location]).pluck(:id)
@ideas = Ideas.where(:user_id => @users)
このようにして、目的の場所の近くでアイデアを取得します (ここではジオコーダーの方法を使用しましたが、別の方法でユーザーを取得することもできます)。
注: ユーザーには多くのアイデアがあり、アイデアはユーザーに属していると想定しています
あなたの場所に一致するすべてのユーザーを検索し、読み込み中にアイデアを含める必要があると思います.
# first about the near by:
def close_to( position )
(position-0.2)..(position+0.2)
end
@users = User.where( :lat => close_to(some_lat), :lng => close_to(some_lng) ).includes( :ideas )
# if you need all the ideas:
@ideas = []
@users.each do |user|
@ideas += user.ideas
end
それ以外の場合は、users 配列に、ユーザーごとに並べ替えられたすべてのアイデアがあります。または、私はあなたの質問を見逃しましたか?