ActiveRecordを使っていい感じにデータを取ってきた、もしくは取ろうとしているものを振り分けて同等に処理をしたいな〜〜、を実現する。例えば、何かしらのIDでフィルタしたいなあ〜、はこういうメソッド。
# @param [ActiveRecord::Base, ActiveRecord::Relation, Array] obj
# @param [Integer] nanika_id
# @param [Symbol] nanika_id_column default is :nanika_id
# @return [ActiveRecord::Base, ActiveRecord::Relation, ActiveRecord::QueryMethods::WhereChain, Array]
def filter(obj, nanika_id, nanika_id_column=:nanika_id)
return obj.filter {|x| x.try(nanika_id_column) == nanika_id } if obj.is_a?(Array)
return obj.where({nanika_id_column => nanika_id}) if obj.is_a?(ActiveRecord::Relation)
raise ActiveRecord::RecordNotFound.new("nanika_id=#{nanika_id} is not found") if obj.try(nanika_id_column) != nanika_id
obj
end
これらのケースに対応できる。
Foo.find(1)
Foo.where(hoka_no_id: 1)
Foo.where(hoka_no_id: 1).map {|f| ... }