2012-04-25 2 views
1

두 개의 ActiveRecord 모델이 있습니다. IdeaUser. 두 사람 사이에는 User.idea처럼 작동하는 연관성이 있습니다.Inverse Association in Rails ActiveRecord

사용자 모델은 현재 latlng 좌표를 사용자로부터 저장합니다.

아이디어 컨트롤러에서 특정 위치와 일치하는 모든 아이디어를 쿼리하고 싶습니다. 나는 레일즈에서이 역 결합 질의를 어떻게 할 수있는 것이 아니다.

답변

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

첫 번째 : 원하는 위치를 어떻게 찾을 수 있습니까? 아마도 Geocoder (RailsCast about it)와 같은 것을 사용할 수 있습니다.

는 지금은 가까운 미래에 비슷한 문제가있을 것이다하지만 순간 내가 아마 두 단계 (더블 쿼리)에서 할 수 있습니다 생각 :

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

당신이 근처 아이디어를 얻을이 방법을 원하는 위치 (여기서 지오 코더 방법을 사용했지만 사용자를 다른 방식으로 얻을 수 있음).

참고 : 나는 사용자를 가정하고있어 많은 아이디어를 가지고 아이디어는 사용자

+0

레일즈에게'.includes (: ideas) '를 사용하여 아이디어를로드하도록 말할 수 있습니다. – klump