我在Rails 3.x中像这样做查询
Speaker.where("name like '%yson%'")
但我希望避免使用特定于DB的代码。这样做的正确方法是什么?
如果在Rails 2.x中也能做到这一点,那也会有所帮助。
发布于 2011-03-17 02:47:13
您可以使用.matches。
> t[:name].matches('%lore').to_sql
=> "\"products\".\"name\" LIKE '%lore'"
查询中的实际使用情况为:
Speaker.where(Speaker.arel_table[:name].matches('%lore'))
发布于 2011-03-17 08:03:15
在Rails 3或更高版本中
Speaker.where("name LIKE ?", "%yson%")
在Rails 2中
Speaker.all(:conditions => ["name LIKE ?", "%yson%"])
避免直接插入字符串,因为值不会被转义,并且容易受到SQL注入攻击。
发布于 2011-03-17 02:51:15
在Rails中不是默认的,因为有太多的DB选项(MySQL,Postgresql,MongoDB,CouchDB...),但是你可以看看像MetaWhere这样的gem,在那里你可以做如下的事情:
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操作符)以使用不同的数据库。希望您不会经常更改数据库,但如果是这样的话,您应该有一个集中的位置来定义这些运算符,以便重用。请记住,一个数据库中定义的运算符或函数可能在另一个数据库中不可用,在这种情况下,由于无论如何都不能执行搜索,因此使用这种通用操作是没有意义的。
https://stackoverflow.com/questions/5330052
复制相似问题