【问题标题】:How to search for a text with Active Record in Ruby on Rails 3?如何在 Ruby on Rails 3 中使用 Active Record 搜索文本?
【发布时间】:2010-07-21 23:20:14
【问题描述】:

如何在 Ruby on Rails 中搜索字符串?

例如,列中包含“文本”的所有记录。

Active Record 有方法吗?还是我必须使用 SQL“LIKE”?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:
     Model.find(:all, :conditions => ['name LIKE ?', "%#{tag}%"])
    

    其中标签是包含字符串的变量

    根据@bjg 评论:-

    或者在 Rails 3 中你可以写成

      Model.where(["name LIKE :tag", {:tag => tag}]) 
    

    使用新的查找器语法 –

    【讨论】:

    • 或者在 Rails 3 中,您可以使用新的查找器语法将其写为 Model.where(["name LIKE :tag", {:tag => tag}])
    • 但我如何告诉 RoR3 在所有列中搜索该模型,而不仅仅是在“名称”列中?
    • @never_had_a_name 检查 sphinx 搜索引擎。检查思维狮身人面像railscasts.com/episodes/120-thinking-sphinx
    • 给定的 RoR 语法对我不起作用。 Model.where('last_name LIKE ?', "%#{name}%")
    【解决方案2】:

    Sqllike在某些情况下可能效率很低,例如in many cases in MySQL。我建议使用一些全文索引软件,例如 Sphinx、Xapian 或 Lucene。

    【讨论】:

    • 所以在 Active Record 中没有办法在每个表及其列中搜索一个字符串?
    • 在所有表中的搜索可以使用如下的原始查询来执行: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 无济于事,如果可以,请使用全文索引软件。
    • 一秒前刚找到,希望对你有帮助snowgiraffe.com/rdocs/ar-extensions/classes/ActiveRecord/…
    【解决方案3】:

    您也可以使用 Arel 的“匹配”方法:

    Model.match(:name => tag)
    

    如果你想在所有列中搜索,那么你应该编写一些额外的代码。

    【讨论】:

    • 也不适合我。使用arel,我会像这样编写查询:Model.where(Model.arel_table[:name].matches("%#{query_string}%"))
    【解决方案4】:

    如果您正在部署到 heroku 或不介意放弃 db 不可知论,postgres 具有全文搜索支持。您无需运行其他服务。此外 PG 是最好的操作系统数据库。 http://tenderlove.github.com/texticle/

    【讨论】:

      【解决方案5】:

      我认为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 中

      【讨论】:

      • 不仅仅是雪貂。 Sphinx 的thinking-sphinx 也很好地与AR 集成。一般来说,使用全文索引软件是个好主意。
      • 雪貂的背部有点痛。它很慢,很容易出现索引损坏,而且我只遇到了一些问题。思考狮身人面像是要走的路。
      猜你喜欢
      • 2018-05-08
      • 2017-06-15
      • 2010-12-06
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      相关资源
      最近更新 更多