2016-07-02 3 views
0

다른 모델과 연관된 모델로 작업하는 지오 코더 gem에서 near 메소드를 얻으려고합니다. 나는 2 개의 모델 레스토랑과 메뉴를 가지고 있고, 메뉴는 레스토랑에 속한다. 나는 각 모델의 검색 방법과 양식을 가지고 가까운 방법은 내 레스토랑 모델 I는 사용자가 입력 한 접시를 판매 사용자 근처 식당을 찾고 있어요지오 코더와 모델 연관이있는 메소드

def self.search_for(params) 
     restaurants = Restaurant.where(category_id: params[:category].to_i) 
     restaurants = restaurants.near(params[:location],2) if params[:location].present? 
     restaurants 
end 

을 작동하지만 코드 제공 아무 방법 오류없는 내 콘솔에서 (undefined method 'restaurants')

def self.search_for_menus(params) 

    menus=Menu.where("dish LIKE ?", "%#{params[:dish]}%") if params[:dish].present? 
    menus= menus.restaurants.near(params[:location],2) if params[:location].present? 
    menus 
    end 

내가 그 레스토랑 객체를 반환 및 추가 작업 방법 근처 지오 코더의 주소를 제공 m.restaurant.address을 할 수 m.restaurantm=Menu.find(11)을 할 수 있어요, 그래서 난 이 문제를 해결하는 방법을 모릅니다.

편집 코드 : 우리는 도움을 당신이

Menu.where("dish LIKE ?", "%#{params[:dish]}%") 

를 사용하는 메뉴에게 방법 내부

를 검색하는 방법 self.search_for_menus (PARAMS)에 고개 경우

def self.search_for_menus(params) 

    menus=Menu.where("dish LIKE ?", "%#{params[:dish]}%") if params[:dish].present? 
    rest_menu = [] 
    menus.each do |menu| 
    rest_menu << menu.restaurant.nearbys(params[:location],2) if params[:location].present? 

    end 


    rest_menu 

    end 
+1

정의되지 않은 메소드 레스토랑이 있고 메뉴에서이를 호출하기 때문에 코드가 실행될 때 메뉴가 정의되지 않았 음을 의미합니다. 어쩌면 당신의 if 조건문이 메뉴 정의 라인에서 false를 반환 할 수도 있습니다. 이것은 byebug와 같은 디버거를 사용하면 더 쉽게 해결할 수 있습니다. –

답변

1

그것이 상위 모델과 역 지오에 가입해야합니다, 해결책을 찾을 수

reverse_geocoded_by "restaurants.latitude", "restaurants.longitude" 

    def self.search_for_menus(params) 

    menus=Menu.where("dish LIKE ?", "%#{params[:dish]}%") if params[:dish].present? 
    menus= menus.joins(:restaurant).near(params[:location],2) 

    menus 

    end 
3

당신은 레코드의 배열을 제공하는 결과를 가져 오는 where 쿼리를 사용하고 있습니다. 메뉴에 따라 관련 레스토랑을 찾으려고합니다.

여러 레코드를 찾을 수 없습니다. 연관은 단일 레코드에서만 작동합니다. 당신은 항상 한 결과를 반환 할 쿼리를 확인하는 경우

당신은 시도 할 수 있습니다이

"메뉴"의 기록은 다음 메뉴

등의 각 레코드에서 반복 할 여러 시도 할 경우

menus=Menu.where("dish LIKE ?", "%#{params[:dish]}%").first if params[:dish].present? 
menus= menus.restaurants.near(params[:location],2) if params[:location].present? 

:

rest_menus = [] 
menus.each do |menu| 
restaurant_location = menu.restaurants.near(params[:location],2) if params[:location].present? 
rest_menus << restaurant_location if restaurant_location.present? 
end 
+0

알겠습니다.하지만 restuarants.where category_id 절이있는 첫 번째 인스턴스에서는 배열도 반환하지 않습니까? near 메서드는 그 경우에 작동하고 위치 근처의 레스토랑 목록을 얻었습니다. 그래서 이론적으로 메뉴를 알게되었습니다. 레스토랑이 작동 할 것이고, 메서드를 시도하고 이제는 "정의되지 않은 메서드"병합을 얻고 있습니다. for 2 : Fixnum "error –

+0

예 그 작업 때문입니다. 먼저 연결을 호출하지 않는 경우, 당신은 restraurant의 배열에 관련된 데이터 묶음을 가진 near 메서드를 직접 호출하고 있습니다. 니어 메소드는 배열의 데이터 묶음으로 호출 할 수 있지만 단일 호출에서는 배열 묶음과 연관시킬 수 없습니다. 정의되지 않은 메서드의 오류가 병합되었습니다! 다른 방법을 위해 위의 코드로 인해 발생하지 않습니다. 공유 코드는이 코드를 살펴볼 것입니다 –

+0

도움을 주셔서 감사합니다. 위의 원본 게시물에서 솔루션 코드를 업데이트했습니다.이 코드는 이제 "정의되지 않은 메서드"병합을 제공합니다!'for 2 : Fixnum "오류가 발생했습니다. 감사합니다. –