質問編集履歴

1 修正為。

widget11

widget11 score 216

2019/11/26 10:59  投稿

ActiveRecordのクエリメソッドはどの階層に記述するべきか
概してビジネスロジックはモデルに書き、複数にまたがるようなモデル操作を行う場合はService層に処理を逃がすというのがMVCの定説だと思いますが、いまいち腑に落ちない点があります。
例えば単純にBookテーブルから1件テーブルからレコードを取得してViewに表示したい場合
```
class BookController < ApplicationController
 def show
   @book = Book.find_by(user_id: current_user.id)
 end
end
```
```
class Book < ApplicationRecord 
 belongs_to :user
  def find_book(id)
      Book.find_by(user_id: id)
   end
end
```
また例えばこのshowアクションで、Bookと共に関連のないモデル(例えばですがCountry)をView側で表示したい場合以下のように書くとします
```
class BookController < ApplicationController
 def show
   @book = Book.find_by(user_id: current_user.id)
  @country = Country.find_by(user_id: current_user.id)
 end
end
```
これをモデルクラスにロジックを逃がす場合、BookコントローラーのshowアクションでCountryを表示したいからCountryモデルに対する操作をBookモデルで行うことは悪手なのでしょうか?
```
class Book < ApplicationRecord 
  belongs_to :user
  def find_book(id)
       Book.find_by(user_id: id)
   end
  def find_country(id)
     Country.find_by(user_id: id)
  end
end
```
こうすればコントローラー側でBookモデルのインスタンスを1つ作るだけでいいので便利な気もするんですが。。。
```
 class BookController < ApplicationController
  def show
   books = Book.new
    @book = books.find_book(current_user.id)
   @country = books.find_country(current_user.id)
  end
 end
```
正直Railsでどうソフトウェア設計を行っていくべきか皆目見当ついていません。
ネットで初心者向けリファレンス見ると結構コントローラー側でビジネスロジック書いている例も多いですし。。。
宜しくお願い致します。
  • Ruby on Rails

    19752 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Active Record

    508 questions

    Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

  • Ruby on Rails 5

    6025 questions

    Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る