1. Qiita
  2. 投稿
  3. Ruby

長くなりがちなRailsのモデルをきれいに分割する

  • 355
    いいね
  • 3
    コメント
この記事は最終更新日から1年以上が経過しています。

FrogApps 技術ブログ始めました!
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps


Railsでアプリを作っていると、app/models/以下にあるモデルファイルの行数が非常に長くなることになります。

そこでincludeメソッドを使ってモデルファイルを機能毎に分割してみましょう。

ファインダー関係のメソッドだけを、user/finder.rbに切り出します。
このときクラスメソッド関係は通常の定義方法が異なります。

クラスメソッドの定義は、ClassMethodsモジュールの中で行う様にします。

has_many, belongs_toなどのクラスメソッドの実行は、self.includedの中でbase.has_manyの様にして呼び出します。

app/models/user.rb
class User < ActiveRecord::Base
   include User::Finder
end
app/models/user/finder.rb
module User::Finder
  def self.included(base)
    base.extend ClassMethods

    # クラスメソッドの呼び出し
    base.has_many :items
  end

  # クラスメソッドの定義
  module ClassMethods
    def hot
      ...
    end
  end

  # インスタンスメソッドの定義
  def search(str)
    ...
  end
end

このようにしてファイルを分けることで、モデルファイルが大きくなるのを避けられ機能毎に整理することができます。