前回の投稿からリファクタリングを進めていて、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]