我有一个用于搜索"文档"的搜索表单,其中包含少量搜索标准,包括" 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])
有什么方法可以解决这个问题吗?
由于
答案 0 :(得分:1)
我从未使用pg_search_scope
,但看起来你确实无法合并两个pg_search_scope
。
您可以将:search_entire_text
与pg_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")