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,如何使用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 = 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