【发布时间】:2010-07-21 23:20:14
【问题描述】:
如何在 Ruby on Rails 中搜索字符串?
例如,列中包含“文本”的所有记录。
Active Record 有方法吗?还是我必须使用 SQL“LIKE”?
【问题讨论】:
标签: ruby-on-rails
如何在 Ruby on Rails 中搜索字符串?
例如,列中包含“文本”的所有记录。
Active Record 有方法吗?还是我必须使用 SQL“LIKE”?
【问题讨论】:
标签: ruby-on-rails
Model.find(:all, :conditions => ['name LIKE ?', "%#{tag}%"])
其中标签是包含字符串的变量
根据@bjg 评论:-
或者在 Rails 3 中你可以写成
Model.where(["name LIKE :tag", {:tag => tag}])
使用新的查找器语法 –
【讨论】:
Model.where(["name LIKE :tag", {:tag => tag}])
Model.where('last_name LIKE ?', "%#{name}%")
Sqllike在某些情况下可能效率很低,例如in many cases in MySQL。我建议使用一些全文索引软件,例如 Sphinx、Xapian 或 Lucene。
【讨论】:
SELECT 'table1' AS table_name, id FROM table1 WHERE c1 LIKE "%text%" OR c2 LIKE "%text%" UNION ALL SELECT 'table2' AS table_name, id FROM table2 WHERE c3 LIKE "%text%",但我不会这样做,这很尴尬。如果你使用 MySQL,它有一些全文索引功能 - dev.mysql.com/doc/refman/5.0/en/fulltext-search.html - 但我不知道它有多好。我不知道其他关系数据库中的全文搜索支持。概括 - AR 无济于事,如果可以,请使用全文索引软件。
您也可以使用 Arel 的“匹配”方法:
Model.match(:name => tag)
如果你想在所有列中搜索,那么你应该编写一些额外的代码。
【讨论】:
arel,我会像这样编写查询:Model.where(Model.arel_table[:name].matches("%#{query_string}%"))
如果您正在部署到 heroku 或不介意放弃 db 不可知论,postgres 具有全文搜索支持。您无需运行其他服务。此外 PG 是最好的操作系统数据库。 http://tenderlove.github.com/texticle/
【讨论】:
我认为acts_as_ferret 插件非常适合您的需求,这个插件可以让您轻松配置非常酷的索引,例如
ActsAsFerret::define_index( 'my_index',
:models => {
SomeModel => {
:fields => {
:name => { :boost => 4, :store => :yes, :via => :ferret_title },
:foo => { :store => :no, :index => :untokenized },
:baz => { :store => :yes, :via => :ferret_content }
}
}
} )
所有acts_as_ferret 索引都配置在一个文件RAILS_ROOT/config/aaf.rb 中
【讨论】: