我刚开始学习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
有没有办法更改原始代码以执行我需要的操作,或者我在这里完全错误的轨道?
感谢您的帮助,
涓
答案 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可能会更好。基本上,一个使用连接,另一个不使用。