この記事はアピリッツの技術ブログ「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)
こういう風に、配列にガシガシ追加するだけーという検索条件の追加の仕方ができます。