5

我有两个模型,Location并且Basic,我正在使用pg_searchgeocoder gem,如何使用 geocoder 方法将范围添加到我pg_search_scope方法 near中,或者如果有另一种方法可以这样做?

Location模型具有纬度和经度列。

在我的控制器中,我能够做到这一点:

# 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模型,我有这个:

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

所以在我的模型中,我有与基本相关的服务。因此,当我搜索名称或服务时,结果会弹出。但我试图只在用户输入的某个位置附近显示结果,这就是为什么我的表location_id中有一个列Basic

这是我的Location模型

class Location < ActiveRecord::Base
  has_many :basics
  geocoded_by :new_address
  after_validation :geocode, :if => :new_address_changed?
  def gmaps4rails_address
    :new_address
  end
  def new_address_changed?
    attrs = %w(street city state)
    attrs.any?{|a| send "#{a}_changed?"}
  end  
end

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

4

1 回答 1

0

听起来您想要的是与匹配 term 的 sLocation附近params[:loc]并与之相关联的s 。如果这种解释是错误的,那么其余的一切都将是错误的。Basicparams[:q]

要纯粹在数据库中执行此操作,您需要locations使用near范围添加的条件与使用添加的条件连接表basicsservicespg_search_scope。不幸的是,我还没有找到任何方法来pg_search_scope与其他表的任意连接一起使用,所以我不知道有一个简单的基于查询的解决方案。但如果你的@business@term结果比较小,你可以在 ruby​​ 中加入。在您的控制器代码之后:

@matching_businesses = @business & @term.map(&:location)

还有其他方法可以做到这一点,但想法是在结果中的那些和与结果中的s关联的那些Location之间找到唯一的 s集。这是另一种可能更清楚地阅读的方式:@businessBasic@term

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

如果这还不够高效,您可能需要编写自己的查询或通读pg_search_scope实现以弄清楚如何使其支持任意连接。

于 2013-12-31T17:45:19.997 回答