问题 Rails 3 - 使用LIKE搜索组合的2列


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

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

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

但我想要做的是搜索组合2列,:fname和lname

当用户搜索我的全名时:

例如詹姆斯布朗 fname =詹姆斯 lname =布朗

有没有办法在Rails中安全地执行此操作,这将适用于SQL,MySQL或Postgres(heroku使用)等数据库?

谢谢!


10823
2017-10-16 01:30


起源



答案:


它可能不漂亮,但我在我的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}%")
}

看到我的一个 其他帖子 为了一点额外,将使搜索查询是可选的。


14
2017-10-16 03:40



这适用于mysql,我不知道其他db的。 - DGM
另外,我的用法需要lastname,firstname,根据需要调整concat。 - DGM
concat会导致全表扫描吗?
是的,它可能会,你的单列搜索。但是,如果不进行一些复杂的索引(如全文搜索),我不知道有什么方法可以进行更密集的搜索。 - DGM
@WozPoz您可以创建一个允许索引前缀搜索的索引,“first_name LIKE'bob%'”,使用类似于:create index first_name_index on people(first_name text_pattern_ops);请注意,这对“first_name LIKE'%bob%'”没有帮助,因为这不是前缀搜索。


答案:


它可能不漂亮,但我在我的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}%")
}

看到我的一个 其他帖子 为了一点额外,将使搜索查询是可选的。


14
2017-10-16 03:40



这适用于mysql,我不知道其他db的。 - DGM
另外,我的用法需要lastname,firstname,根据需要调整concat。 - DGM
concat会导致全表扫描吗?
是的,它可能会,你的单列搜索。但是,如果不进行一些复杂的索引(如全文搜索),我不知道有什么方法可以进行更密集的搜索。 - DGM
@WozPoz您可以创建一个允许索引前缀搜索的索引,“first_name LIKE'bob%'”,使用类似于:create index first_name_index on people(first_name text_pattern_ops);请注意,这对“first_name LIKE'%bob%'”没有帮助,因为这不是前缀搜索。


这最终工作得非常好......虽然不确定性能。索引可以帮忙吗?

:conditions => ['fname || lname LIKE?',“%#{search}%”]


0
2017-10-18 18:47



好吧也许这不太理想。如果你添加另一个条件,如:[project =? AND'fname || lname LIKE?',“%#{search}%”,“%#{search2}%”]日志中的查询变得非常混乱。不知道为什么呢? - WozPoz