2

我想添加一個條件,只有符合條件的記錄從模型中抓取。例如,我試圖僅從:price大於或不等於0的事務模型中抓取記錄(我試過>和!=,但在下面的示例中都不起作用)。活躍的記錄軌道上的條件3

price = Transaction.where(:company_id => company).where(:price != 0.00) 

我也試過這樣:

price = Transaction.where(:company_id => company).where(:price != 0.00).collect{|item| if item.price.to_f > 0.00 {item.price.to_f} end} 

...以及兩個上面的其他變化沒有工作。

上面的第一個例子不會產生錯誤,但根本不起作用。條件被忽略。第二個示例會產生語法錯誤。

我也很確定有一種方法可以在SQL中使用條件來做到這一點,但不知道如何去做。

有什麼建議嗎?

回答

13

此:

.where(:price != 0.00) 

是一樣的話說:

.where(true) 

的符號永遠不會等於浮動; where(true)是沒有意義的,因爲它只是將數據庫的真實文本(PostgreSQL的't',SQLite和MySQL中的1)添加到WHERE子句中,並且不會執行任何有用的操作;例如,如果你說:

Transaction.where(:company_id => company).where(:price != 0.00) 

那麼你的SQL最終會像這樣的PostgreSQL:

select * from transactions where company_id = #{company} and 't' 

,這就是一樣只是說

select * from transactions where company_id = #{company} 

查詢時有時候混淆你有時在Rails控制檯的最後添加一個.to_sql是很有幫助的,並且看看SQL最終會做什麼(如果你不知道SQL,那麼你應該學習它,如果你打算使用關係數據庫以任何能力)。

你要發送的對比數據庫,不做這裏面紅寶石:

price = Transaction.where(:company_id => company) 
        .where('price != ?', 0) 

我假設你price列是一個小數類型,而不是一個浮點類型;如果我錯了,那麼現在將它改爲十進制。

+0

我對SQL有很多瞭解。這很棒!謝謝! – mmichael 2012-03-15 15:03:12

+0

@mmichael:是的,如果您使用關係數據庫,則無法脫離SQL,當您知道幕後發生了什麼時,清理問題就容易得多。 – 2012-03-15 17:39:39