2011-10-18 11 views
3

AREL/ActiveRecord APIを使用して、このクエリをより短く、よりエレガントに記述できますか?このクエリをAREL/ActiveRecordでもっと上手く書くことはできますか?

Foo.where("(bar is not null and bar != '') or (baz is not null and baz !='')") 
+0

おそらくRaw SQLはより簡潔であることが多く、特定のDBMに直接結ばれていることがあります。ORMが強く連結されていないためです。 –

答えて

9

あなたは直接ARELでORオペレータを行うことができますが、構文は非常きれいではなく、ハードビットを読むために得ることができます。ここでarelのように見えるでしょう:

foo = Foo.arel_table 
Foo.where(foo[:bar].not_eq(nil).and(foo[:bar].not_eq('')).or(foo[:baz].not_eq(nil).and(foo[:baz].not_eq('')))) 

私は豪華な宝石を見ることをお勧めします。それはあなたにアクティブレコードのより多くのarel機能へのアクセスを与えます。あなたのクエリは次のように希望:http://erniemiller.org/projects/squeel/

あなたドンので、もしsqueelに、それはいくつかの異なる構文のスタイルをサポートしていることを書くことができますいくつかの異なる方法があります。ここでは

Foo.where{(bar.not_eq nil) & (bar.not_eq '') | (baz.not_eq nil) & (baz.not_eq nil)} 

は、より多くの情報のためのリンクです上記のものには選択肢がありました。

+0

squeelが更新されていないようです3年後継者のようです:https://github.com/rzane/baby_squeel移行する必要がある場合は、ドキュメントもあります。 –

1

これに対処するには(データベースでこれを行う権限があれば)、データベース内の空の文字列値を許可しないことです。それから、Foo.where(:bar => nil)を実行できます。私はこのためにattribute_normalizerを使用し、また値を正しくフォーマットします。

https://github.com/mdeering/attribute_normalizer

クイック検索もnilify空白を明らかにしたが、私は理由属性正規化は、すでに私のためにその機能を提供することを試していません。

https://github.com/rubiety/nilify_blanks

あなたがうまく保たれたデータベースを持っている場合(いずれかの空のフィールドにnullまたは空の文字列値は、おそらくそれを取得ほど短いです。したい検索の結果のSQLは、(私は空の文字列に自分を)好みます。

+0

これは理想的ですが、そうではありません。この場合保守可能な解決策 –

関連する問題