# 複数レコードに対する操作を Rails で作るとき、どのような URL やモデル設計にするのが綺麗なのか？

**URL:** <https://discourse.clean-rails.org/t/rails-url/16>\
**Category:** Uncategorized\
**Created:** [2018 年 3 月 19 日午後 2:27 UTC](https://discourse.clean-rails.org/t/rails-url/16 "2018-03-19T14:27:22Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![willnet](https://discourse.clean-rails.org/user_avatar/discourse.clean-rails.org/willnet/32/4_2.png) [@willnet](https://discourse.clean-rails.org/u/willnet)\
**Post date:** [2018 年 3 月 19 日午後 2:27 UTC](https://discourse.clean-rails.org/t/rails-url/16/1 "2018-03-19T14:27:23Z")

</div>

[Railsのきれいなコードのお題案 · Issue #1 · clean-rails-ja/conversation](https://github.com/clean-rails-ja/conversation/issues/1#issuecomment-353382977)からの転載

普通の Rails で作られる RESTful には無い bulk update な要件。

## 例

ToDo リストで複数のタスクに対して「まとめて完了にする」「まとめてタグを付ける」などをする機能。  
[remember the milk](https://www.rememberthemilk.com/)の画面がイメージに近いです。

 ![todo](https://clean-rails.s3.dualstack.ap-northeast-1.amazonaws.com/original/1X/8cf56127e4adc34779b195a896329319b226df81.png)

似たような機能でありがちなものだと、「通知をまとめて既読にする」とかもあります。

---

<div class="post-metadata">

**Author:** ![boneandrea](https://discourse.clean-rails.org/user_avatar/discourse.clean-rails.org/boneandrea/32/903_2.png) [@boneandrea](https://discourse.clean-rails.org/u/boneandrea)\
**Post date:** [2018 年 4 月 15 日午前 7:30 UTC](https://discourse.clean-rails.org/t/rails-url/16/2 "2018-04-15T07:30:55Z")

</div>

クラスの違うものが並んでいたりするともっと迷いますね  
まずどこのコントローラに要求投げればいいのかとか。

---

<div class="post-metadata">

**Author:** ![joker1007](https://discourse.clean-rails.org/user_avatar/discourse.clean-rails.org/joker1007/32/902_2.png) [@joker1007](https://discourse.clean-rails.org/u/joker1007)\
**Post date:** [2018 年 4 月 16 日午前 7:51 UTC](https://discourse.clean-rails.org/t/rails-url/16/3 "2018-04-16T07:51:30Z")

</div>

この例で言うと、POROでToDoListというモデルが作れるんじゃないだろうか。  
複数のものを持つ上位概念を集約ルートとして定義できるか、まず考える。  
どうしても合致する概念が無いならCollectionクラスを定義します。

---

<div class="post-metadata">

**Author:** ![tkawa](https://discourse.clean-rails.org/user_avatar/discourse.clean-rails.org/tkawa/32/900_2.png) [@tkawa](https://discourse.clean-rails.org/u/tkawa)\
**Post date:** [2018 年 4 月 17 日午前 4:08 UTC](https://discourse.clean-rails.org/t/rails-url/16/4 "2018-04-17T04:08:19Z")

</div>

ルーティング（とコントローラ）について。  
「複数のタスクをまとめて操作」なのでいわゆるバルクアップデートですね。

CRUDを素直に考えると、コレクションリソースである tasks への PUT/PATCH になります。なのでそれを特別なアクションに割り当てる。

```ruby
# config/routes.rb
resources :tasks
patch :tasks, to: 'tasks#bulk_update'

```

→ `PATCH /tasks(.:format) tasks#bulk_update`

もっと細かく「まとめて完了」という操作だけに注目するなら、複数のタスクのステータスだけをリソースとして切り出す。

```ruby
# config/routes.rb
resources :tasks
namespace :tasks do # resources のネストでも書けるけどシンプルにならない
  resource :status_attribute, only: %i(show update)
end

```

→ `PATCH /tasks/status_attribute(.:format) tasks/status_attributes#update`

僕ならこのどちらかにします。

---

<div class="post-metadata">

**Author:** ![koheisg](https://discourse.clean-rails.org/user_avatar/discourse.clean-rails.org/koheisg/32/884_2.png) [@koheisg](https://discourse.clean-rails.org/u/koheisg)\
**Post date:** [2018 年 4 月 17 日午前 6:23 UTC](https://discourse.clean-rails.org/t/rails-url/16/5 "2018-04-17T06:23:16Z")

</div>

諸手を上げて賛成もできないのですが、DHHのgistにあったので貼っておきます

> <https://gist.github.com/dhh/981520>
