Ruby on rails Rails:如何通过位置搜索为pg_搜索添加范围?

Ruby on rails Rails:如何通过位置搜索为pg_搜索添加范围?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.2,scope,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 3.2,Scope,我有两个模型,Location和Basic,我正在使用和gem,如何使用geocodernear方法或如果有其他方法来添加范围到我的pg\u搜索范围 位置模型具有纬度和经度列 在我的控制器中,我可以做到: # this allows me to search near the Location model @business = Location.near(params[:loc], 15) # this searches through the pg_search_scope @term =

我有两个模型,
Location
Basic
,我正在使用和gem,如何使用geocoder
near
方法或如果有其他方法来添加范围到我的
pg\u搜索范围

位置
模型具有纬度和经度列

在我的控制器中,我可以做到:

# this allows me to search near the Location model
@business = Location.near(params[:loc], 15)

# this searches through the pg_search_scope
@term = Basic.search(params[:q])

#I'm trying to combine @business and @term
对于
Basic
model,我有以下功能:

pg_search_scope :search, :against => [:first_name, :last_name], 
  :associated_against => {
    :services => [:service, :description]
  },
  :using => {
    :tsearch => {:disctionary => "english" }
  }
我想将
@business
@term
合并为一个
(@search)
这可能吗

谢谢

++++++++++++++++

因此,在我的
Basic
模型中:

class Basic < ActiveRecord::Base
  belongs_to :location

  has_many :services, as: :servicable

  pg_search_scope :search, :against => [:first_name, :last_name], 
    :associated_against => {
      :services => [:service, :description]
    },
    :using => {
      :tsearch => {:disctionary => "english" }
    }

end

所以我试图把这些方法联系起来。理想情况下,应用程序将首先搜索所有附近的结果,然后搜索附近结果中匹配的术语,然后仅显示适用的术语。

听起来您想要的是
位置附近
参数[:loc]
并与匹配术语
参数[:q]
基本
关联。如果这种解释是错误的,那么这一切都将是错误的

要完全在数据库中执行此操作,您需要使用
near
范围添加的条件将
locations
表与
basics
services
表连接起来,使用
pg\u search\u范围添加的条件。不幸的是,我还没有找到任何方法将
pg\u search\u scope
与其他表进行任意连接,因此我不知道一个简单的基于查询的解决方案。但是如果您的
@business
@term
结果相对较小,那么您可以在ruby中加入。在控制器代码之后:

@matching_businesses = @business & @term.map(&:location)
还有其他方法可以做到这一点,但其思想是在
@业务
结果中的位置与
@术语
结果中与
基本
相关的位置之间找到唯一的
位置集。下面是另一种可能更清晰的方式:

@matching_businesses = @business.select do |business|
  @term.any? { |basic| business.basics.include?(basic) }
end

如果这还不够好,您可能需要编写自己的查询或阅读
pg\u search\u scope
实现,以了解如何使其支持任意联接。

您是否可以提供
@business
@term
的输出,以及描述您希望
@search
成为什么样的内容?@andrewliu您是否可以指定
Location
Basic
模型之间的关系?您获取这些模型的示例来自两个不同的类,它们之间没有关系。我的意思是设置
@term
不依赖于
@business
的结果,因此将其合并到单个范围可能不是您想要的-但我可能错了。您是否正在尝试根据
@term
@business
中的值创建一个结果数组?我总是在任何其他调用之前使用
包含
,如果您可以这样做,请尝试,否则请尝试将
包含
替换为
连接
@andrewliu。我将在帮助您解决此问题时起草一个答案,我会调查一下丢失的身份证。
@matching_businesses = @business.select do |business|
  @term.any? { |basic| business.basics.include?(basic) }
end