2010-01-10 56 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