2012-05-19 34 views
9

我目前使用Act_as_taggable_on进行标记,并使用pg_search在我的Rails 3应用程序中搜索我的postgresql数据库。Rails:如何使用PG_Search搜索由Act_As_Taggable_On生成的标签? (postgresql)

我该如何搜索由pg_search的act_as_taggable_on gem生成的标签?我可以这样查看张贴的标签“Post.find(1).tag_list,”但也有中邮表中没有“标签”列,所以当我运行

pg_search_scope :search_by_weight, :against => {:tag_list => 'A', :title => 'B', :content => 'C'} #,:using => [:tsearch => {:prefix => true}] #:trigram, :dmetaphone] 

它给了我一个错误,因为邮政表中不存在Post.tag_list列。当通过点连接器(即mission.tag_list)可以找到该值时,什么叫它,但是当它不存在于表中?我不知道打字是什么。所以基本上,我如何通过一个不存在的列作为参数?

而且,你可能已经注意到我注释掉

:using => [:tsearch => {:prefix => true}] #:trigram, :dmetaphone] 
以上

。我似乎无法找到如何为Postgresql安装额外的模块。我在哪里可以输入CREATE EXTENSION? (使用ubuntu 11.10和postgresql 9.1.3 - >和heroku进行生产)

+0

@muistooshort如何解决这个任何想法? – kibaekr

回答

8

一个更简单的方法是只使用联想和搜索,通过pg_search这是这样完成的:

class Item < ActiveRecord::Base 
include PgSearch 

    pg_search_scope :full_search, 
    :against => { 
    :item_status => 'A', 
    :title => 'B', 
    :description => 'C'  
    },  
    :associated_against => { 
    :tags => [:name]  
    } 
end 

我只是在我的项目之一来实现这一点,它的工作好(通过标签名称搜索)。不幸的是,我无法弄清楚如何对相关关系进行加权,因为它在Items表中找不到“标签”列。

+0

感谢您的回答!是的,到目前为止,我确实已经认识到了这一点,但是我也有同样的问题来衡量标签。 您是否能够获得额外的搜索功能(即trigram)? (您使用的是Heroku吗?) – kibaekr

+0

嗨,我没有尝试添加任何其他搜索功能,只是关联之一。我正在使用Heroku,不幸的是,pg_search宝石现在不适合我,但我正在为此工作。据说pg_search很容易与Heroku一起使用,不像其他一些全文搜索引擎,所以我认为这将是一个简单的修复。如果标签可以被加权,或者标签可以用“完全匹配”完成,那么标签的目的是什么? – user783437

+0

我明白了。是的,我认为我有额外的功能在本地工作,但我认为它现在不适用于Heroku。 (我想这可能是因为我需要更新或安装服务器上的contrib包,但是heroku不会让我访问pg数据库的更新和安装) – kibaekr

1

几年前,我在plpgsql中编写了我的实现。看我的博客:http://omarqureshi.net/articles/2010-12-25-tsearch2-for-rails-applications,其中涵盖了如何让它工作。

+0

嗯......作为一个初学者,试图理解你在博客文章中做了什么并将其应用于我的情况仍然非常令人困惑。 – kibaekr

+0

我会先阅读plpgsql指南和触发器文档Postgres的。 –

+0

这是解决方案!非常好的帖子奥马尔,虽然有些功能有点过于复杂,我把它们清理了一下。尽管如此,如果没有你的博客文章,我永远都不会做到。如果可以的话,我会给你10分的投票)干杯 – 2013-02-28 17:41:32

3

这为我工作,以获得标签加权以及

pg_search_scope :search_by_weight, 
     :against => { 
     :title => 'B', 
     :content => 'C'  
    },  
    :associated_against => { 
     :tags => { :name => 'A' }  
    }, 
    using: {tsearch: {dictionary: "english"}}