この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
日々の気温差に体がついて行っていない気がする中西です。
少し前にarel_tableを使用したので、簡単な使い方等をメモしてみます。
複雑なSQL文
スコープなどを書こうと思った場合に、条件がすこし難しい場合があります。
そういった時に、生のSQL文を使用することもあると思います。
少し前に、下記のようなスコープを書いたとこがありました。
scope :except_codes, -> { where.not('(test_code = 0 OR test_code IS NULL) AND code_created_at IS NULL') }
生のSQL文をを用いています。
そのとき、先輩からarel_tableの話を聞き使ってみることにしました。
使ってみた結果が、下記になります。
scope :except_codes, -> { where.not(arel_table[:test_code].eq_any([0, nil]).and(arel_table[:code_created_at].eq(nil))) }
今回は、短いSQL文ですが、長いSQL文になった場合、生のSQL文では後々わかりずらくなってしまう恐れがあります。
そういった場合に、arel_tableを使うことで後々理解がしやすくなると思われます。
arel_tableの使い方
今回上記で使用した部分について簡単にメモします。
まず、下記部分で使用するカラム名を指定しています。
arel_table[:test_code]
arel_table[:code_created_at]
このあとに、条件を追加します。
それぞれ、今回使用している部分は下記のような意味となります。
eq_any(○) :○以外の場合(≠)
eq(○) :○の場合(=)
○の部分が複数ある場合、配列として入力することで複数の値を条件にできます。
a.eq([0, 1]) :aが「0」か「1」の場合
複数の条件を組み合わせたい場合には、andやorを用いることができます。
こうすることで、複雑な条件文の場合にも比較的簡単に書くことができます。
まとめ
今回は実際に自分が使用した、簡単な部分についてメモしてみました。
このほかにも、likeやorder等も簡単に書けるようです。
気になる方が、調べてみてください。
追記(2016/2/2)
ちょっと指摘があったので追記。
今回紹介しているarel_tableは、Rails用の非公開APIなので、使用する場合は、それを念頭に置き、注意してください。