2011-03-16 74 views

回答

11

您可以使用它.matches。

> t[:name].matches('%lore').to_sql 
=> "\"products\".\"name\" LIKE '%lore'" 

查询中的实际用法是:

Speaker.where(Speaker.arel_table[:name].matches('%lore')) 
+0

不错。我猜百分号在SQLite,Postgres和Mysql之间可能是常见的。 – 2011-03-16 20:29:54

+1

建议修改代码片段以阅读:'Speaker.where(Speaker.arel_table [:name] .matches('%yson%'))' – 2013-11-19 21:19:27

2

使用像solr或sphinx这样的搜索引擎为您要执行的列创建索引就像查询。 Like查看解释计划时,查询总是会导致全表扫描,因此您几乎从不在生产站点中使用它们。

+1

我投这个票,但“真的不应该使用它们”有点强。如果你有一个中等数量的记录,我宁愿使用类似的查询,而不是在中间层上检索和迭代。显然,如果性能成为问题,那么你应该使用索引。我认为你的意思是“或”不是“,”顺便说一句。 – 2011-03-16 22:01:17

1

默认情况下未在Rails的,因为有这么多的DB选项(MySQL和PostgreSQL,MongoDB中,CouchDB的...),但你可以查出来的宝石一样MetaWhere,在那里你可以做这样的事情:

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') 

虽然在一般你可能要有一些具体的数据库代码,或重构你的代码(即重新定义S上.matches操作MetaWhere中的ymbols)与另一个数据库一起工作。希望你不会经常改变你的数据库,但是如果你是你的话,你应该有一个集中的位置来定义这些运营商的重用。请记住,在一个数据库中定义的操作符或函数可能在另一个数据库中不可用,在这种情况下,由于您无法执行搜索,因此进行这种广义操作是毫无意义的。

+0

谢谢。这绝不是关于更改数据库:它是关于让中间层不填充特定于DB的代码,因此您可以剪切并粘贴它,并且通常会忘记数据库存在。 – 2011-03-16 22:03:40

+0

然后我认为MetaWhere创业板是你最好的选择。它将这个抽象出来,让你使用酷语法,比如:title.matches,而不是'title LIKE?'。 – 2011-03-16 22:14:10

+0

感谢希望尽快检查它 – 2011-03-17 17:43:04

23

在Rails 3或更大

Speaker.where("name LIKE ?", "%yson%") 

在Rails 2

Speaker.all(:conditions => ["name LIKE ?", "%yson%"]) 

避免直接插字符串,因为该值将不会被逃脱,你很容易受到SQL注入式攻击。

+1

酷和正确,虽然它不回答这个问题。 – 2011-03-17 17:42:31

相关问题