具有模型关联的 Geocoder near 方法

Geocoder near method with model associations

我正在尝试从地理编码器 gem 获取 near 方法,该方法使用与另一个模型相关联的模型。我有 2 个模型餐厅和菜单,菜单属于餐厅。我在每个模型中都有一个带有搜索方法的表单,near 方法适用于我的餐厅模型

 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=Menu.find(11) 然后 m.restaurant 哪个 returns 那个餐厅对象,并且可以进一步执行 m.restaurant.address 为地理编码器 near 方法提供地址工作,所以我不确定如何解决这个问题。

编辑代码:

 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

如果我们查找方法 self.search_for_menus(params) 这有助于搜索菜单

在您正在使用的方法中

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

您正在使用 where 查询结果为您提供记录数组,并且您正在尝试根据菜单查找关联的餐厅

无法在多条记录上找到关联仅在单条记录中有效。

如果您确保查询总是 return 第 1 个结果,那么您可以试试这个

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

如果 "menus" 中的记录有多个,则尝试在菜单的每个记录中循环

喜欢:

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

找到解决方案,它需要连接父模型和反向地理编码

 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