2012-04-25 82 views
1

我有兩個ActiveRecord模型。 IdeaUser。這兩者之間有一個聯繫,就像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

如果你有確切的經度和緯度,這可能是一個很好的解決方案(雖然很少有可能與花車確切/十進制) – 2012-04-25 18:54:54

+1

他應該能夠通過一個範圍:'some_lat = 56.311018..56.711018'。而這些的生成可以通過一種方法來完成。 – klump 2012-04-25 18:58:51

+1

這超出了問題的範圍。 'some_lat'可以是一個範圍。 Rails將處理這個魔法。 – jdoe 2012-04-25 19:01:35

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

第一:你如何找到想要的地點?可能你可以使用Geocoder之類的東西(有一個RailsCast about it)。

現在我有一個類似的問題在不久的將來,但就目前而言,我想我可能會做兩步(雙查詢):

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

這樣你得到附近的思路想要的位置(我在這裏使用了Geocoder方法,但可以以不同的方式獲取用戶)。

注:我假設用戶有很多的想法和理念屬於用戶

+0

你可以告訴rails用'.includes(:ideas)'加載屬於用戶的想法。 – klump 2012-04-25 19:08:06