【问题标题】:Rails 3 - Using LIKE to search a combined 2 columnsRails 3 - 使用 LIKE 搜索组合的 2 列
【发布时间】:2010-10-16 01:30:50
【问题描述】:

我在这里关注 ryan 的简单搜索表单教程: http://railscasts.com/episodes/37-simple-search-form

我的用户模型中有以下行:

find(:all, :conditions => ['fname LIKE ?', "%#{search}%"])

但我想做的是在合并的 2 列中搜索:fname & lname

当用户搜索我的全名时:

例如,詹姆斯·布朗 fname = 詹姆斯 lname = 棕色

有没有一种方法可以在 Rails 中安全地执行此操作,并且可以跨 SQLite、MySQL 或 Postgres(heroku 使用)等数据库工作?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    它可能不漂亮,但我在我的 Person 模型中使用它:

    scope :by_full_name lambda {|q| 
        where("first_name LIKE ? or last_name LIKE ? or concat(last_name, ', ', first_name) LIKE ?", "%#{q}%", "%#{q}%" , "%#{q}%")
    }
    

    请参阅我的other posts 以获取更多信息,这将使搜索查询成为可选的。

    【讨论】:

    • 另外,我的使用需要姓氏,名字,根据需要调整concat。
    • concat 会导致全表扫描吗?
    • 是的,它可能是这样,您的单列搜索也是如此。但我不知道有什么方法可以在不做一些复杂的索引(如全文搜索)的情况下进行更密集的搜索。
    • @Pickle,全表扫描是什么意思?
    • @WozPoz 您可以创建一个允许索引前缀搜索的索引,“first_name LIKE 'bob%'”,使用类似:create index first_name_index on people (first_name text_pattern_ops);请注意,这对“first_name LIKE '%bob%'”没有帮助,因为这不是前缀搜索。
    【解决方案2】:

    这最终工作得非常好......但不确定性能。索引可以帮助解决这个问题吗?

    :条件 => ['fname || lname LIKE ?', "%#{search}%"]

    【讨论】:

    • 好吧,也许这并不理想。如果您添加另一个条件,例如: [project = ? AND'fname || lname LIKE ?', "%#{search}%", "%#{search2}%"] 日志中的查询变得非常混乱。不知道为什么?
    猜你喜欢
    • 2014-10-18
    • 2015-05-05
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2016-08-03
    • 2017-03-14
    相关资源
    最近更新 更多