1

我试图弄清楚如何使用 pg_search_gem 和 pg_search_scope 将多个参数传递给我的搜索

这是我的简单搜索

include PgSearch
  pg_search_scope :simple_search, against: [:title, :description], using: { tsearch: { dictionary: "spanish"} } 

def self.search(search)
    if search.present?
        simple_search(search)
    else
        find(:all)
    end
end

但现在我正在尝试做这样的事情

include PgSearch
  pg_search_scope :simple_search, against: [:title, :place, :category], using: { tsearch: { dictionary: "spanish"} } 

def self.searchadv(title, place, category)
  simple_search(:title => title, :place => place, :category => category)
end

我知道这是完全错误的,但这是我的调查。


更新

这是新代码

  pg_search_scope :advance_search, lambda {|*args, query|
      return {:against => args,
      :query => query,
      using: { tsearch: { dictionary: "spanish"} } }
  }

def self.searchadv(query, title, place, category)
    advance_search(:all, :title => title, :place => place, :category => category)
end

还是行不通。但它几乎完成了!我收到此错误:

wrong number of arguments (3 for 4)
4

2 回答 2

1

您可以使用动态搜索范围

include PgSearch
  pg_search_scope :simple_search, lambda do |query, *args| 
    return { :against => args, :query => query }
  end

def self.searchadv(query, title, place, category)
  simple_search(query, :title => title, :place => place, :category => category)
end
于 2013-01-08T20:37:06.440 回答
1

4年前,我正在寻找这个问题的答案。所以,这就是我发现的并且有效。也许它会帮助某人:

我将 2 个数组传递给搜索范围,一个带有列,另一个带有查询。因此,您可以根据需要添加任意数量的列和查询。

include PgSearch
  pg_search_scope :advanced_search, (lambda do |args, query|
    return {
      :against => args, :query => query
    }
  end)

Model.advanced_search([:name, :current_status, :user_id],
            [params[:q_name], params[:q_status], params[:q_user]])
于 2017-01-13T09:56:57.837 回答