その他
    ホーム技術発信DoRubyActiveRecordのconditionsを綺麗に書くTips2つ

    ActiveRecordのconditionsを綺麗に書くTips2つ

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    高瀬です。Railsで開発してる 人は一部の例外(RubyでActiveRecordを使わないでDBに接続する方法)を除いてactiverecord(AR)でDBを検索すると思います。 今回はARでDBの検索をする際に綺麗に書けるようになるtipsです。

    1.conditions句をシンボル使ってDRYに書く

    conditions句って実はシンボル使えるらしいのです。

    最近まで知りませんでした。

    というわけで、?だと

    :conditions =>[“(prefecture_id = ? and user_id = ?)  or (other_prefecture_id = ? and other_user_id = ?)”,  11, 2, 11, 2]

     と、分けわかんなくなっちゃう様な検索文を

    :conditions =>[“(prefecture_id = :prefecture_id and user_id = :user_id)  or (other_prefecture_id = :prefecture_id and other_user_id = :user_id)”, {:prefecture_id => 11, :user_id => 2}]

    っていう書き方ができます。

    2.ヘルパつかってみる。 

    こんなライブラリとかをつかいます。

    module ActiveRecordHelper
    def flatten_conditions(conditions, op = “and”)
    return nil if conditions.empty?
    ps = []
    condition = conditions.collect do |c|
    next if c.size < 1
    ps += c[1..(c.size)]
    “( #{c[0]} )”
    end.delete_if { |c| c.blank? }.join(” #{op} “)
    [condition, ps].flatten unless condition.empty? end
    end

    class ActiveRecord::Base
    include ActiveRecordHelper
    end

    そーすると

    @condition = []

    @condition << [” prefecture_id = ? “, params[:prefecture] ] if params[:prefecture]

    @condition << [” sex = ? “, params[:sex] ] if params[:sex]

      @users = User.find(:all, :conditions => @conidition)

    こういう風に、配列にガシガシ追加するだけーという検索条件の追加の仕方ができます。