如何使用Ruby on Rails进行OR SQL搜索?

时间:2009-04-25 20:49:03

标签: ruby-on-rails

我刚开始学习Ruby on Rails,但我找不到这个问题的答案。

我有以下代码:

@products = Product.find(:all,
  :conditions => ["productsubtype_id = ?", @productsubtypes],
  :order => "name")

@productsubtypes是一个数组(当前包含来自另一个SQL查询的两个对象,几乎与此相同) - 它生成的SQL如下:

SELECT * FROM `products` WHERE (productsubtype_id = 2,3)  ORDER BY name

正如您所看到的,上面的内容无效(至少不适用于MySQL) - 我需要找到一种方法来更改原始的Ruby代码以生成以下SQL代码(或接近它的内容:

SELECT * FROM `products` WHERE (productsubtype_id = 2 
  OR productsubtype_id = 3)  ORDER BY name

有没有办法更改原始代码以执行我需要的操作,或者我在这里完全错误的轨道?

感谢您的帮助,

4 个答案:

答案 0 :(得分:3)

这些解决方案都有效,但ActiveRecord已经内置支持,可以在使用条件哈希时知道是否传递数组或单个id。例如:

User.all(:conditions => {:id => [1,2,3]})

生成查询

SELECT * FROM `users` WHERE (users.`id` IN( 1,2,3 )) 

所以你想要

@products = Product.find(:all,
  :conditions => {:productsubtype_id => @productsubtypes},
  :order => "name")

对于更复杂的查询,你需要在条件中传递sql或使用插件(即conditions_fu)

答案 1 :(得分:1)

尝试使用conditions_fu插件。

Product.all(:conditions => { :productsubtype_id.in => @productsubtypes },
:order => "name")

答案 2 :(得分:1)

@products = Product.find(:all,

:conditions => [“productsubtype_id IN(?)”,@ productinsubtypes],

:order => “名称”)

答案 3 :(得分:1)

还必须考虑使用IN vs EXISTS。如果您在IN中使用的子集非常大,则使用EXISTS可能会更好。基本上,一个使用连接,另一个不使用。