首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Rails 2.x和3.x中使用ActiveRecord进行“喜欢”查询吗?

在Rails 2.x和3.x中使用ActiveRecord进行“喜欢”查询吗?
EN

Stack Overflow用户
提问于 2011-03-17 02:33:49
回答 3查看 13K关注 0票数 19

我在Rails 3.x中像这样做查询

代码语言:javascript
复制
Speaker.where("name like '%yson%'")

但我希望避免使用特定于DB的代码。这样做的正确方法是什么?

如果在Rails 2.x中也能做到这一点,那也会有所帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-17 02:47:13

您可以使用.matches。

代码语言:javascript
复制
 > t[:name].matches('%lore').to_sql
 => "\"products\".\"name\" LIKE '%lore'"

查询中的实际使用情况为:

代码语言:javascript
复制
Speaker.where(Speaker.arel_table[:name].matches('%lore'))
票数 11
EN

Stack Overflow用户

发布于 2011-03-17 08:03:15

在Rails 3或更高版本中

代码语言:javascript
复制
Speaker.where("name LIKE ?", "%yson%")

在Rails 2中

代码语言:javascript
复制
Speaker.all(:conditions => ["name LIKE ?", "%yson%"])

避免直接插入字符串,因为值不会被转义,并且容易受到SQL注入攻击。

票数 23
EN

Stack Overflow用户

发布于 2011-03-17 02:51:15

在Rails中不是默认的,因为有太多的DB选项(MySQL,Postgresql,MongoDB,CouchDB...),但是你可以看看像MetaWhere这样的gem,在那里你可以做如下的事情:

代码语言:javascript
复制
Article.where(:title.matches => 'Hello%', :created_at.gt => 3.days.ago)
  => SELECT "articles".* FROM "articles" WHERE ("articles"."title" LIKE 'Hello%')
     AND ("articles"."created_at" > '2010-04-12 18:39:32.592087')

一般来说,您可能需要一些特定于DB的代码,或者重构您的代码(即在MetaWhere中重新定义symbols上的.matches操作符)以使用不同的数据库。希望您不会经常更改数据库,但如果是这样的话,您应该有一个集中的位置来定义这些运算符,以便重用。请记住,一个数据库中定义的运算符或函数可能在另一个数据库中不可用,在这种情况下,由于无论如何都不能执行搜索,因此使用这种通用操作是没有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5330052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档