クエリメソッドの条件句でBetween句を生成する

Between句を生成する場合は、対象となる列に範囲式を設定することで対応できる!これってとても素敵だなぁ。

[sourcecode language="ruby"] if params != nil

 …

  shiharaibi_from = get_date('shiharaibi_from')
  shiharaibi_to = get_date('shiharaibi_to')

   condition = Hash.new

  add_item condition, :spent_date, shiharaibi_from.to_s, shiharaibi_to.to_s
end

@ledgers = Ledger.joins('INNER JOIN himokus ON himokus.id = ledgers.himoku_id')
              .joins('INNER JOIN payments ON payments.id = ledgers.pay_id')
              .select('ledgers.*, himokus.himoku_code, himokus.himoku_name, payments.pay_name')
              .where(condition)

 …

# 引数のハッシュに要素を追加します def add_item(hash, key, value, date_to = nil)

if date_to == nil
  …
else
  if key != nil && value.to_s != ""
    if !hash.key? key

      # 範囲式を利用する
      hash[key] = value .. date_to
      logger.debug "the hash add item. key:" + key.to_s + " / value:" + hash[key].to_s
    end
  end
end

end

[/sourcecode]

これで、取得できるSQLは

[sourcecode language="sql"] SELECT ledgers.* … FROM "ledgers" INNER JOIN … WHERE "ledgers"."himoku_id" = 1 AND "ledgers"."pay_id" = 1 -- ここがBetween句となる AND ("ledgers"."spent_date" BETWEEN '2010-09-10' AND '2011-10-10') [/sourcecode]

のような条件句を生成したSQLになるよ。

何が素敵って、検索条件をハッシュにして指定するだけで自動的に生成してくれるわけだから素敵。 ちなみに、in句を生成する場合はハッシュの値にin句で指定したい配列をセットすればOK!