その他
    ホーム 技術発信 DoRuby arel_tableを使った時のメモ

    arel_tableを使った時のメモ

    この記事はアピリッツの技術ブログ「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なので、使用する場合は、それを念頭に置き、注意してください。