2017-01-11 8 views
3

TL; DR:論理ドメインクラスをどのように整理するか分かりません。Rails:モデルのメソッドが多すぎる

私がモデルの「アプリケーション」を持って、このモデルはアプリケーションの「コア」であると私は、「入り」等の他のモデルで動作方法です:

@application = Application.find(params[:application_id]) 
@application.payment.update_attribute 'active', true 

または

unless @application.report.status 

または

@application.set_income(params[:income][:new_income]) 

私はアプリケーションを初期化するので、そのモデルが支払い、所得や報告書は基本的に空になっていますそこから「カスケード」のことをして、「従属」モデルを変更します。しかし、アプリケーションモデルには40以上のメソッドと600行があります。

私はそれを正しくやっていますか? ActiveRecordのは、自動的に外部キーを処理する方法を「知っている」ので、アプリケーションモデル内

payment = Payment.create params 

:たとえば、私は私がやりたい新しい支払いを追加したいとき。私が使用してお支払いモデル内部の支払いを作成することができます。

application = Application.find(application_id) 
params[:application_id] = application.id 
self.create params 

が、この方法を、私は手動でApplication.idを設定する必要があり、それは、より詳細なとエレガントではないに見えます。

私のアプリケーションモデルを減らそうとすると、モジュールをAPP/libディレクトリに作成する必要がありますか、他のモデルにメソッドを移動する必要がありますか?

+0

難しい質問の長さです。いくつかはヘルパーにいくつかの他のモデルに移動することができます。また、他のモデルのメソッドを構築して、新しい支払いなどをエレガントに作成することもできます。 –

答えて

2

私はAPP/libディレクトリにモジュールを作成する必要があります

基本的には、はい、それはあなたが何をすべきかです。私はおそらくそれらをモジュールではなくクラスにするでしょう。あなたの後ろにいるように聞こえるパターンは、「サービスオブジェクト」(または「ユースケース」)と呼ばれます。これは、実行したい特定の操作からロジックを取り出し、自身の内蔵クラスに入れます。その後、そのクラスは必要なモデルと連携します。したがって、あなたのモデルはかなり小さくなり、 "サービスクラス"は単体責任原則に従います。あなたのコントローラーは、通常、必要な作業を行うために単一の「サービスクラス」を呼び出します。コントローラもごくわずかしかありません。

"rails service objects"などのGoogleサービスをご利用の場合は、すばらしいサービスがたくさんありますが、ここから始めるにはいくつかのリソースがあります。

サービスはキャストレールオブジェクト:https://www.youtube.com/watch?v=uIp6N89PH-c

https://webuild.envato.com/blog/a-case-for-use-cases/

https://blog.engineyard.com/2014/keeping-your-rails-controllers-dry-with-services

http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/あなたがサービスオブジェクトを使用して起動します一度

は、覚えておいてください(そこにサービスオブジェクトの1つのセクションがあります)、必ずしもあなたのApplicationモデルを通って関連するものに行く必要はありません。サービスオブジェクトはapplication_idをとり、次に実行します。 @payment = Payment.find_by(application_id: application_id)であるため、アプリケーションインスタンスをまったく取得する必要はなく、@payment変数を直接操作できます。

Railsが関連するモデルに簡単にアクセスできるということは、必ずしもそうする必要はありません。

1

TL:あなたのアプリケーションに、データベースのテーブルにすべて結びついている(つまり、ActiveRecordを活用し、ActiveModel :: Baseから継承している)4つのモデルがある場合、フレームワークはモデルクラスを使用するようにかなり説かれています。

サービスクラスパターンを抽象化すると便利な場合もありますが、中断することがあります。 Railsの利点の1つは、多くのことの中で、あなたのために組織の意思決定を行うことで、開発の障害を取り除くことになっていることです。モデルクラスを活用しましょう。

これが戦争を争う叙事詩的な開発者になるかどうかを見てみましょう。また

、関連するモデル作成のために、あなたのモデルのインターフェイスを作成するそのOK:

class Application < ActiveModel::Base 
    has_one :payment 

    def create_payment(attrs) 
    payment.create(attrs) 
    end 
end 

し、[OK]を、私はフレームワークがこれを許可することを意味します。しかし、createを含む多くのインスタンスメソッドを定義するActiveModel::Baseから既に継承していることに注意してください。

私は、espをお勧めします。これは、小規模なプロジェクトであり、あなただけのデータベースにオブジェクトを読み書きするために、よく名前のレールコントローラを使用するために、あなたの足が濡れている場合:

class ApplicationPaymentsController < ActionController::Base 
    def create 
    application = Application.find(params[:id]) 
    application.create_payment(payment_params) 
    end 

    private 

    def payment_params 
    params.require(:payment).permit(:x, :y) - whatever your attr names are. 
    end 
end 

あなたが外部キーを抽象化して探しているsleekness

http://guides.rubyonrails.org/association_basics.html(良い出発点)

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one(より明示的なドキュメント)

あなたがスリムに役立つ:リレーショナルレコードを作成するにはRailsの団体とのあなたのためのケアのを取られますそれがあなたの目標ならダウンモデル。明確にするために、これは開発者がどちらかといえば非常に強く意見を述べているものの1つですが、実際にはコードの匂い(対処すべき)があり、ファイルの長さを任意に説く人々がいます。この中で最も重要なことは、読みやすいコードです。

リファクタリングのためのリトマステストは数週間置いておき、それに戻ってきて、混乱させるようにしたら、しばらくしてそれを改善してください。それ以外の場合は、特にあなたがソロで働いている場合、あなたがやることを楽しんでください。

0

Railsで長いコントローラとスペックファイルについて心配することはありません。

これらのファイルは非常に長くなる傾向があり、クラスとメソッドを短く保つための通常のアドバイスは、コントローラとその仕様に必ずしも適用されません。

たとえば、当社の生産システムでは、user_controller.rbは8500行で、対応するuser_controller_spec.rbは7000行です。私たちは40個の方法を知らないので、

これが私たちのトップ10のコントローラ

1285 app/controllers/*********_controller.rb 
1430 app/controllers/***********_controller.rb 
1444 app/controllers/****_controller.rb 
1950 app/controllers/****_controller.rb 
1994 app/controllers/********_controller.rb 
2530 app/controllers/***********_controller.rb 
2697 app/controllers/*********_controller.rb 
2998 app/controllers/*****_controller.rb 
3134 app/controllers/application_controller.rb 
8737 app/controllers/users_controller.rb 
関連する問題