如何使用Ruby Gem ActiveRecord,Sinatra和Postgres搜索表

时间:2014-01-03 14:14:24

标签: sql ruby postgresql activerecord sinatra

如何使用Ruby Gem ActiveRecord,Sinatra和Postgres进行单词搜索?

我的表看起来像这样:

create_table "posts", :force => true do |t|
  t.string   "title"
  t.text     "body"
  t.string   "image_url"
  t.integer  "user_id"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
end

我试图在标题和正文字段中搜索关键词。

使用ActiveRecord Documentation我尝试Post.find_by(body: "a")但是我的身体确实包含了字符 a

我知道在Rails中你会做这样的事情:

  Post.where(["body LIKE :tag", {:tag => word}])

但我无法弄清楚如何使用Sinatra和Postgres做同样的事情。

2 个答案:

答案 0 :(得分:2)

看看postgres的tsearch。 http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/

这是一个非常简单的搜索。有很多选项可供选择,例如,标题中的匹配比正文中的匹配更多。

您可以在表格中添加一个矢量列:

 ALTER TABLE posts ADD COLUMN vector tsvector;

然后

 UPDATE posts SET vector=('default',coalesce(title,'') ||' '|| coalesce(body,''));
 VACUUM FULL ANALYZE;

然后你可以查询:

 SELECT * FROM posts WHERE vector @@ to_tsquery('default', 'Test | Zeppelin');

答案 1 :(得分:0)

找不到可以执行此工作的方法,但是使用ActiveRecord Gem运行原始SQL确实可以解决问题:

Post.find_by_sql("SELECT * FROM posts WHERE title LIKE '%word%' OR body LIKE '%word%';")

希望有时会帮助某人......