【Rails】複数テーブルで関連したデータを持つモデルをつくる

dotinstallに従ってやってみる。

今回はTaskというデータがProjectのデータに結びつくように設定してみる。

今まで自力で全部やってたじぶんにとってはめっちゃ違和感。慣れよう

modelを生成

まずはmodelを生成する

$ rails g model Task title done:boolean project:references

関連させたいテーブル名:references

とするらしい。なんだこれすげぇ。

Taskモデルを確認してみると以下のようになっていて、紐付けされてますよー的なコードが書かれていることがわかる。

class Task < ActiveRecord::Base
  belongs_to :project
end

そしたら今度はProjectモデルの方にも、これが関連付けられてますよーって教えるコードを書く(ここは自動では関連付けされない)

class Project < ActiveRecord::Base
  has_many :tasks    # ここを追加
  validates :title, 
    presence: { message: "* Type the title" },
    length: { minimum: 3, message: "* Minimum Letter Number is 3" }
end

そしたらdbに反映させておく

rake db:migrate

controller / view を生成

Taskコントローラを生成する

$ rails g controller Tasks

routing設定

config/routes.rbを以下のように設定

  resources :projects do
    resources :tasks, only: [:create, :destroy]
  end

routesの確認をしてみると、createとdestroyのみルートが生成されてるのがわかる

▶ rake routes
       Prefix Verb   URI Pattern                               Controller#Action
project_tasks POST   /projects/:project_id/tasks(.:format)     tasks#create
 project_task DELETE /projects/:project_id/tasks/:id(.:format) tasks#destroy
     projects GET    /projects(.:format)                       projects#index
              POST   /projects(.:format)                       projects#create
  new_project GET    /projects/new(.:format)                   projects#new
 edit_project GET    /projects/:id/edit(.:format)              projects#edit
      project GET    /projects/:id(.:format)                   projects#show
              PATCH  /projects/:id(.:format)                   projects#update
              PUT    /projects/:id(.:format)                   projects#update
              DELETE /projects/:id(.:format)                   projects#destroy
         root GET    /                                         projects#index