pg_search_scope:链接范围似乎不可能

时间:2017-01-21 23:06:19

标签: pg-search

我有一个用于搜索"文档"的搜索表单,其中包含少量搜索标准,包括" whole_text","关键字"和"描述"。

我使用pg_search_scope,但我有2个不同的范围。

这是我的document.rb:

pg_search_scope :search_entire_text, 
                :against => :entire_text, 
                :using => {
                    :tsearch => {
                        :prefix => true,
                        :dictionary => "french"
                        }
                    }

pg_search_scope :search_keywords,
                :associated_against => {
                    :keywords => [:keyword]
                },
                :using => {
                    :tsearch => {
                        :any_word => true
                    }
                }

每个单独工作正常。但我不能这样做:

@resultats = Document.search_keywords(params[:ch_document][:keywords]).search_entire_text(params[:ch_document][:entire_text])

有什么方法可以解决这个问题吗?

由于

3 个答案:

答案 0 :(得分:1)

我从未使用pg_search_scope,但看起来你确实无法合并两个pg_search_scope

您可以将:search_entire_textpg_search_scope一起使用,并在Document.where([1,2,3])中使用生成的ID,这样您就可以使用标准的rails scope来进行剩余的关键字搜索。

示例:

# If pluck doesn't work you can also use map(&:id)
txt_res_ids = Document.search_entire_text(params[:ch_document][:entire_text]).pluck(:id)
final_results = Document.where(id: txt_res_ids).some_keyword_scope.all

答案 1 :(得分:0)

有效。这是整个代码......如果这可以帮助某人:

Acte.rb(我没有翻译成英文,解释被评论为与上述问题相对应)

pg_search_scope :cherche_texte_complet, #i.e. find entire text
                :against => :texte_complet, 
                :using => {
                    :tsearch => {
                        :prefix => true,
                        :dictionary => "french"
                        }
                    }

pg_search_scope :cherche_mots_clefs, #find keywords
                :associated_against => {
                    :motclefs => [:motcle]
                },
                :using => {
                    :tsearch => {
                        :any_word => true
                    }
                }

def self.cherche_date(debut, fin) #find date between
    where("acte_date BETWEEN :date_debut AND :date_fin", {date_debut: debut, date_fin: fin})
end

def self.cherche_mots(mots)
    if mots.present? #the if ... else is necessary, see controller.rb
        cherche_mots_clefs(mots)
    else
        order("id DESC")
    end
end

def self.ids_texte_compl(ids)
    if ids.any?
        where("id = any (array #{ids})")
    else
        where("id IS NOT NULL")
    end
end

actes_controller.rb

ids = Acte.cherche_texte_complet(params[:ch_acte][:texte_complet]).pluck(:id)

@resultats = Acte.cherche_date(params[:ch_acte][:date_debut],params[:ch_acte][:date_fin])
.ids_texte_compl(ids)
.cherche_mots(params[:ch_acte][:mots])

谢谢!

答案 2 :(得分:0)

链接至少在pg_search 2.3.2中有效

SomeModel.pg_search_based_scope("abc").pg_search_based_scope("xyz")