【问题标题】:How to search a table using Ruby Gem ActiveRecord, Sinatra and Postgres [closed]如何使用 Ruby Gem ActiveRecord、Sinatra 和 Postgres 搜索表 [关闭]
【发布时间】:2014-01-03 14:14:24
【问题描述】:

如何使用 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 来做同样的事情。

【问题讨论】:

  • 到目前为止你的尝试是什么形式?请发布代码,即使它不完整,并显示您卡在哪里。这样可以更好地了解如何最好地帮助您。
  • @NeilSlater 我更新了我的问题。希望它显示了我所做的尝试。

标签: sql ruby postgresql activerecord sinatra


【解决方案1】:

看看 tsearch 的 postgres。 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');

【讨论】:

  • 谢谢约翰。看起来很困难,但是我试图避免在我的应用中添加更多的宝石。
  • 它实际上不是一个 gem,它是一个 postgres 扩展。可能有 gem 包装器,但我只是在安装扩展后使用了上面的本机 SQL。 tsearch 有很多选项,而且非常强大。
  • 谢谢。我会调查的
【解决方案2】:

找不到可以完成这项工作的方法,但是使用 ActiveRecord Gem 运行原始 SQL 确实成功了:

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

希望它会在某个时候对某人有所帮助......

【讨论】:

    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 2013-07-31
    • 2013-12-05
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    相关资源
    最近更新 更多