Rails 3.2.0 で複雑な条件での検索:conditionはオブジェクトとして配列にし最後にwhereする: 簡潔編

前回の投稿からリファクタリングを進めていて、Module: Arel::Predicationsクラスというものにたどり着きました。matches, eq以外にもたくさんのメソッドが用意されています。

■それらを使って「属性の条件を格納した配列を返すメソッド」を短くできました。

↓リファクタリング前
[ror]
def ors_by_pattribute
pattribute_table = Pattribute.arel_table
@result = @result.joins(:pattributes).group('pattributes_people.person_id')
pattribute_ids = @pattributes.collect {|x| x.to_s}
ors = []
pattribute_ids.each do | pattribute_id |
ors << pattribute_table[:id].eq(pattribute_id)
end
ors
end
[/ror]

↓リファクタリング後

[ror]
pattribute_table = Pattribute.arel_table
@result = @result.joins(:pattributes).group('pattributes_people.person_id')
[pattribute_table[:id].in_any(@pattributes)]
[/ror]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です