2010-01-10 55 views
3

这个工程:轨活动记录 - 复杂条件子句

ids = [1,2] 
varietals = Varietal.find(:all, :conditions => [ "id IN (?)",ids]) 

但我想要做的是,加上有一个条件:删除=>假

varietals = Varietal.find(:all, :conditions =>{ :deleted => false}) 

什么想法?

我将不得不使用find_by_sql?

回答

3

你可以做一些方法,但是这是最简单的:

varietals = Varietal.find([1,2], :conditions => { :deleted => false }) 

可以see in the docs说的find第一个参数可以采取一个整数或数组。

+0

是这种方法SQL注入安全吗?它看起来像AR不会写我准备好的声明,所以不知道AR如何防止sql注入 – 2010-01-10 17:37:26

+0

是的,这个声明是SQL注入安全的。它只允许一个整数或一个整数数组或多或少。只要你按照适当的惯例来调用你的AR发现,你的查询将是安全的。 (即不要做:':conditions =>'deleted =#{@ deleted}''而不是':conditions => {:deleted => @deleted}'或类似的东西 – 2010-01-10 19:27:02

2
ids = [1,2] 
varietals = Varietal.find(:all, :conditions => {:id => ids, :deleted => false}) 

这应该工作,虽然没有测试过。

docs

阵列可在散列被用于 使用SQL IN操作者:

Student.find(:all, :conditions => { :grade => [9,11,12] }) 
+0

这也可以,但是来自Doug Neiner的更简洁 – 2010-01-10 06:12:07

+0

它对于这种情况可能是更好的选择,但是你应该感谢你现在知道如何在一个散列中组合多个条件!) – user94154 2010-01-10 17:35:12

+0

我是。谢谢:) – 2010-01-10 21:00:40

5

我将处理这个与named_scope通信意图和培育再利用:

named_scope :undeleted, 
      :conditions => { :deleted => false } 

然后哟你可以简单地使用:

varietals = Varietal.undeleted.find([1,2]) 
+0

+1的方法和范围 – 2011-04-26 00:40:45