私は2つのActiveRecordモデルを持っています。 Idea
およびUser
。 2人の間には、User.idea
のように機能している関連があります。Railsでの逆アソシエーションActiveRecord
ユーザーモデルは現在、ユーザーから座標lat
とlng
を保存します。
アイデアコントローラからは、特定の場所に一致するすべてのアイデアを照会したいと思います。私はどのようにRailsでこの逆結合クエリを行うことができません。
私は2つのActiveRecordモデルを持っています。 Idea
およびUser
。 2人の間には、User.idea
のように機能している関連があります。Railsでの逆アソシエーションActiveRecord
ユーザーモデルは現在、ユーザーから座標lat
とlng
を保存します。
アイデアコントローラからは、特定の場所に一致するすべてのアイデアを照会したいと思います。私はどのようにRailsでこの逆結合クエリを行うことができません。
私はあなたがこれをしたいと思います:
Idea.joins(:user).where(user: {lat: some_lat, lng: some_lng}).all
some_lat
/some_lng
範囲することができます。 Railsは魔法を扱います。
あなたの場所に一致するすべてのユーザーを検索し、読み込み中にアイデアを含める必要があると思います。
# 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
そうしないと、ユーザーが並べ替えたアイデアがすべてユーザーアレイに表示されます。それともあなたの質問が恋しくなったのですか?
最初に、希望の場所をどのように見つけますか?おそらく、ジオコーダーのようなものを使うことができます(RailsCast about itがあります)。
今、私は近い将来、同様の問題があるでしょうが、しばらくの間、私はおそらく2つの段階(ダブルクエリ)でそれをやると思った:
@users = User.near(params[:location]).pluck(:id)
@ideas = Ideas.where(:user_id => @users)
あなたが近くアイデアを得るこの方法(ここではジオコーダーメソッドを使用しましたが、別の方法でユーザーを取得できます)。
注:めったにそれはフロート/小数を正確にすることはできませんけれども、私は(ユーザーは多くのアイデアを持っており、アイデアは、ユーザー
あなたは '.includes(:ideas)'を使ってユーザに属するアイデアを読み込むようにレールに指示することができます。 – klump
に属しますが、正確な緯度と経度を持っている場合、これは良い解決策かもしれないと仮定しています) –
'some_lat = 56.311018..56.711018'という範囲を渡すことができるはずです。そして、これらの世代は方法によって行うことができます。 – klump
それは問題の範囲外です。 'some_lat'はRangeです。 Railsは魔法を扱います。 – jdoe