2

条件に合致するレコードのみがモデルから取得される条件を追加しようとしています。たとえば、:priceが0以上のトランザクションモデル(私は試してみましたが、!=しかし以下の例では動作しませんでした)からレコードを取得しようとしています。アクティブレコードレール上の条件3

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

また、私はこれを試してみた:その上記2の

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

...だけでなく、他のバリエーションは動作しませんでした。

上記の最初の例ではエラーは発生しませんが、単に機能しません。条件は無視されます。 2番目の例では、構文エラーが発生します。

私はまた、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} 

を言うのと同じですあなたを混乱させることがあります。最後に.to_sqlをRailsコンソールに追加して、SQLが何をしているのかを確認すると便利です(そして、SQLを知らないのなら、リレーショナル任意の容量のデータベース)。

あなたは、Rubyの内側にそれをしないで、データベースとの比較を送りたい:

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

私はあなたのprice列がdecimal型ではなく、浮動小数点型であることを仮定しています。私が間違っている場合は今すぐ小数点に変更してください。

+0

私はSQLについて多く知っています。これは素晴らしい!ありがとうございました! – mmichael

+0

@mmichael:リレーショナルデータベースを使用しているなら、SQLから離れてはいけません。背後で何が起こっているのかを知ると、問題を整理するのがずっと簡単になります。 –