LoginSignup
14
12

More than 5 years have passed since last update.

has_many関連を拡張する

Posted at

例えばこんな事をしたい場合。

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

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12