2012-04-25 11 views
1

私は2つのActiveRecordモデルを持っています。 IdeaおよびUser。 2人の間には、User.ideaのように機能している関連があります。Railsでの逆アソシエーションActiveRecord

ユーザーモデルは現在、ユーザーから座標latlngを保存します。

アイデアコントローラからは、特定の場所に一致するすべてのアイデアを照会したいと思います。私はどのようにRailsでこの逆結合クエリを行うことができません。

答えて

1

私はあなたがこれをしたいと思います:

Idea.joins(:user).where(user: {lat: some_lat, lng: some_lng}).all 

some_lat/some_lng範囲することができます。 Railsは魔法を扱います。

+0

に属しますが、正確な緯度と経度を持っている場合、これは良い解決策かもしれないと仮定しています) –

+1

'some_lat = 56.311018..56.711018'という範囲を渡すことができるはずです。そして、これらの世代は方法によって行うことができます。 – klump

+1

それは問題の範囲外です。 'some_lat'はRangeです。 Railsは魔法を扱います。 – jdoe

0

あなたの場所に一致するすべてのユーザーを検索し、読み込み中にアイデアを含める必要があると思います。

# 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 

そうしないと、ユーザーが並べ替えたアイデアがすべてユーザーアレイに表示されます。それともあなたの質問が恋しくなったのですか?

1

最初に、希望の場所をどのように見つけますか?おそらく、ジオコーダーのようなものを使うことができます(RailsCast about itがあります)。

今、私は近い将来、同様の問題があるでしょうが、しばらくの間、私はおそらく2つの段階(ダブルクエリ)でそれをやると思った:

@users = User.near(params[:location]).pluck(:id) 
@ideas = Ideas.where(:user_id => @users) 

あなたが近くアイデアを得るこの方法(ここではジオコーダーメソッドを使用しましたが、別の方法でユーザーを取得できます)。

注:めったにそれはフロート/小数を正確にすることはできませんけれども、私は(ユーザーは多くのアイデアを持っており、アイデアは、ユーザー

+0

あなたは '.includes(:ideas)'を使ってユーザに属するアイデアを読み込むようにレールに指示することができます。 – klump

関連する問題