Ruby on rails “做”;例如;在Rails 2.x和3.x中使用ActiveRecord进行查询?

Ruby on rails “做”;例如;在Rails 2.x和3.x中使用ActiveRecord进行查询?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我在Rails3.x中执行类似的查询 Speaker.where("name like '%yson%'") 但是我希望避免使用DB特定的代码。正确的方法是什么 如果在Rails 2.x中也有这样做的方法,那也会有所帮助。使用solr或sphinx等搜索引擎为要执行类似查询的列创建索引。当您查看解释计划时,Like查询总是导致全表扫描,因此您几乎不应该在生产站点中使用它们。您可以使用.matches > t[:name].matches('%lore').to_sql => "

我在Rails3.x中执行类似的查询

Speaker.where("name like '%yson%'")
但是我希望避免使用DB特定的代码。正确的方法是什么


如果在Rails 2.x中也有这样做的方法,那也会有所帮助。

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

您可以使用.matches

 > t[:name].matches('%lore').to_sql
 => "\"products\".\"name\" LIKE '%lore'"
查询中的实际使用情况为:

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

在Rails中,默认情况下不是这样,因为有太多的DB选项(MySQL、Postgresql、MongoDB、CouchDB…),但您可以查看gems,例如,在这里您可以执行以下操作:

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中重新定义符号上的.matches运算符)以使用不同的数据库。希望您不会经常更改数据库,但如果是这样,您应该有一个集中的位置,在那里定义这些操作符以供重用。请记住,在一个数据库中定义的运算符或函数在另一个数据库中可能不可用,在这种情况下,使用此通用操作是没有意义的,因为您无论如何都无法执行搜索。

在Rails 3或更高版本中

Speaker.where("name LIKE ?", "%yson%")
在Rails 2中

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

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

不错。我猜百分号在SQLite、Postgres和Mysql之间可能很常见。建议修改代码片段,改为:
Speaker.where(Speaker.arel_table[:name]。matches(“%yson%”))
我对此投了赞成票,但“真的不应该使用它们”有点强。如果您有中等数量的记录,我更喜欢使用like查询,而不是在中间层检索和迭代。显然,如果性能成为一个问题,那么您应该使用索引。我想你的意思是“或”不是“的”,顺便说一句,谢谢。它永远不会改变数据库:它是让中间层不被特定于数据库的代码填充,这样你就可以剪切和粘贴它,并且通常忘记数据库的存在。那么我认为MetaWhere gem是你最好的选择。它对此进行了抽象,并允许您使用很酷的语法,如:title.matches,而不是“title like?”。