酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Railsで1つのモデルを複数ファイルに分けて書く方法

Railsではモデルに多くの処理を書くのが一般的ですが、長くなりすぎると可読性が悪くなってしまう可能性があります。そこで、『concerned_withパターン』を使えば1つのモデルを複数ファイルに分けて書くことができます。


複数ファイルの読み込み設定

ActiveRecordにで複数ファイルを読み込むconcerned_withメソッドをconfig/initializers/concerns.rbに追加します。

1
2
3
4
5
6
7
class << ActiveRecord::Base
  def concerned_with(*concerns)
    concerns.each do |concern|
      require_dependency "#{name.underscore}/#{concern}"
    end
  end
end

モデル側の記述

モデルProductcomputer.rbファイルとsmart_phoneファイルに分けて管理するとします。(下はファイル構成)

model/product.rb
model/product/computer.rb
model/product/smart_phone.rb

model/product.rbのサンプルはこちら。

1
2
3
class Product < ActiveRecord::Base
  concerned_with :computer, :smart_phone
end

model/product/computer.rbは次の通り。

1
2
3
4
5
class Product
    def create_computer
    ...
    end
end

model/product/smart_phone.rbは次の通り。

1
2
3
4
5
class Product
    def self.create_smart_phone
    ...
    end
end

これでProduct.create_smart_phoneや、product.create_computerが利用できます。

おまけ: ActiveSupport::Concern

ActiveSupport::Concernを使う方法もあるようです。

Rubyでの特異メソッド定義方法まとめ | もっとクールにプログラミング

Use concerns to keep your models manageable

Special Thanks

Concerned_withパターンでRailsのひとつのmodelを複数ファイルに分けて書く方法 - memo.yomukaku.net

おすすめの書籍