pg_search不返回单个字段的结果

时间:2012-06-20 10:15:14

标签: ruby-on-rails-3 pg-search

我的“资产”模型的搜索页面除了搜索特定于“serial_no”字段的任何内容外,一切正常。

Asset.rb

# == Schema Information
#
# Table name: assets
#
#  id                :integer         not null, primary key
#  asset_description :string(255)
#  asset_type        :string(255)
#  status            :string(255)
#  serial_no         :string(255)
#  user_id           :integer
#  cost              :decimal(, )
#  barcode           :string(255)
#  comment           :string(255)
#  date_purchased    :date
#  created_at        :datetime        not null
#  updated_at        :datetime        not null
#
class Asset < ActiveRecord::Base
  attr_accessible :asset_description, :asset_type, :comment, 
  :date_purchased, :serial_no, :status, :user_id, :cost, :barcode
  belongs_to :user
  validates  :user_id, presence: true
  validates  :asset_description, presence: true
  validates  :asset_type, presence: true
  validates  :serial_no, presence: true, uniqueness: true
  validates  :status, presence: true
  validates  :comment, length: { maximum: 150 }

  include PgSearch
  pg_search_scope :search, against: [:asset_description, :status, :asset_type, 
    :comment, :cost, :serial_no, :date_purchased],
   using: {tsearch: { dictionary: "english" }},
   associated_against: { user: :name }

  #older assets first
  default_scope order: 'assets.created_at ASC'

  def self.text_search(query)
    if query.present?
      search(query)
    else
      scoped 
    end
  end
end

例如,我有一个带有serial_no的资产:Z21313412A但是当我搜索“Z”时,没有返回任何结果。我一直试图解决这个问题几个星期,但没有运气。

1 个答案:

答案 0 :(得分:4)

根据documentation

PostgreSQL’s full text search matches on whole words by default. 
If you want to search for partial words, however, you can set :prefix to true. 
Since this is a :tsearch-specific option, you should pass it to :tsearch 
directly, as shown in the following example.

也许在配置中添加:prefix可以解决问题 来自Github页面的示例:

pg_search_scope :whose_name_starts_with,
              :against => :name,
              :using => {
                :tsearch => {:prefix => true}
              }