2014-03-26 59 views
0

我有一個發票表中的狀態整數列軌道4:返回從所有實例,其中呼籲

def change 
    create_table :invoices do |t| 
    t.integer :status 
    end 
end 

我一找到這樣

def find_status(status) 
    Invoice.where(status: status) 
end 

這是偉大的,當我想找到狀態爲1的所有發票。

但是,有時我想find_status方法返回所有發票?

我可以用if語句解決這個問題,但我的問題是;

我可以將某些內容傳遞給find_status方法來返回所有發票嗎? PS:在回顧這個問題後,我明白如果有人得到誘惑,建議其他解決方案的問題。請把這個問題看成是一個「概念類問題的教授」

回答

1

假設你沒有數百個狀態,但是無法抵抗誘惑,你可以把一個數組或範圍放入方法調用中 - if你想他們所有我會避免方法調用,只是做Invoice.all

+0

沒有提及的範圍,因爲我不知道你的狀態是否是數字或類似「激活」的東西,「完成」 e.t.c. –

+0

他們是如此完美的範圍。謝謝! –

0

這幾乎是不可能的,因爲where不支持通配符在這種情況下,像大範圍選項導致非常不潔的代碼。但您可能會使用Invoice.all而不是調用此方法。

+0

沒有什麼是不可能的。我可以使用這樣的範圍0..99999999999 –

+0

@AndreasLyngstad更好? – Migol

+0

大聲笑是的!感謝您的回覆。 –

0

如果你堅持對兩者使用相同的方法,你可以改變你的find_status方法。

def find_status(status = nil) 
    status.nil? ? Invoice.all.to_a : Invoice.where(status: status) 
end 
+0

感謝您的回覆。這用途,如果其他,因爲我說我不想 –

+0

是的...我明白了。但是,我認爲你的意圖是使用相同的方法。我不知道這種採摘方法。在這種情況下,您可以使用@Baloo建議的內容。 –

+0

或者我應該建議'find_status Invoice.all.to_a' –

0

這是絕對不可能的!希望如果我們能做到這一點,那將是一個真正的安全問題。 不過,如果你不介意缺乏安全的,你仍然可以寫類似

def find_status(status) 
    Invoice.where("status = #{status}") 
end 

然後

find_status(1) #=> All invoices with the status 1 
find_status('status') #=> All invoices :) 

但同樣,我所做的就是利用缺乏安全的!如你所說,你可以很容易地使用一個if或者一個?條件聲明

其實!你可以這樣做:

find_status Invoice.pluck(:status) 

它可以在不改變你的方法:)

+0

當我們有可實現的東西時,爲什麼仍然提出缺乏安全性的方法。你能否刪除以前提出的方法(缺乏安全性的方法)? –

+1

因爲了解安全問題是避免它們的好方法:) – Oxynum

+1

那麼爲什麼我錯過了這個想法呢? ;)在那種情況下,我們應該知道這一點。 –