【Ruby】ActiveRecordのAssociationにメソッドを追加する

ActiveRecordhas_manyとかbelongs_toとかのAssociationはブロックを渡してメソッドを追加することができます。

class User
  has_many :blogs do
    # ステータスがopenのものを取得する
    def open
      where(status: 'open')
    end
  end
end

こんな感じで、ブロックの内部で関数を定義するとその関数をメソッドチェーンで実行できるようになります。

User.first.blogs.open

複数のモデルで使い回したい処理がある場合は、moduleにまとめてextendオプションでメソッドを追加することも可能です。

module Common
  def open
    where(status: 'open')
  end
end
class User
  has_many :blogs, extend: Common
end

配列にして、複数のmoduleも渡せます。

class User
  has_many :blogs, extend: [Common, Common2]
end

便利ー!!