例えばこんな事をしたい場合。
class User < ActiveRecord::Base
has_many :items
end
User.items.total_attack # 装備しているアイテムの総攻撃力
User.items.drop_random! # ランダムでアイテムを1つ落とす
scope
で実装できることも多いと思いますが、SQLだけで処理できないような(Arelだけで記述できないような)処理をscope
にしてしまうのもいかがなものかと思います。
has_many
にはextend
オプションがあって、その名の通り関連を拡張できます。
module ItemCollection
def total_attack
# ...
end
def drop_random!
# ...
end
end
class User < ActiveRecord::Base
has_many :items, extend: ItemCollection
end
参考
Rails4ではhas_many
に渡したブロック内でextending
するようです。
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Association+extensions