【Rails】has_many と belongs_to のリレーションで データベースに保存する

あらかじめ Userモデルがあって、Userが複数のArticlesを作成できて、Articleは一人のUserに属するという、1対多( has_many – belongs_to )の関係を作っていきたいと思います。

環境はこちらです

Migration

既存のモデル(ここでは User )との、リレーションを構築するので、 user:references とします。このオプションで user_id カラム、 外部キー制約、インデックスを自動で作成してくれます。ちなみに references は belongs_to に入れ替えても同じです
また、 CRUD 機能を素早く構築するために、本記事では scaffold を使っています。

db/migrate/20xxxxxxxxxx_create_articles.rb

書き換えられたスキーマものせておきます。index もはられていますね。

db/schema.rb

モデルにhas_manyとbelongs_toを追加する

User は複数の articles を持つという関連を定義するので、 has_many :articles です。また、dependent: :destroyオプションを追加することで、User が articles を持ったまま退会してしまったなどの時、 User に 紐付いていた articles も全て削除してくれます。

app/models/user.rb

Article 側は一人の User に属するので、 belongs_to :user と書きます。

app/models/article.rb

Controllers

関連するモデルを生成するときは、 build メソッドを使います。これで外部キーに値が入った状態でインスタンスが生成できます。
ちなみに本記事では 「ログインしている User のみ Articles を作成できる」としているため、 current_user としています。
成功した後のリダイレクト先は my_page にしています。

app/controllers/articles_controller.rb

また、本記事では my_page でログインしている User が自身の Articles を管理できるようにしています。

app/controllers/users/registrations_controller.rb

Views

最後に my_page で一覧表示させます。 articles/index をそのままこっちに持ってきた感じです。

app/views/devise/registrations/my_page.html.erb

rails create articles

以上です!
また、Userにreferencesを持たせるパターンの実装はこちらの記事をご覧ください。
参考になれば幸いです!


投稿者:

Shuji

読書したり、プログラミングしたりしています。何かアウトプットできそうなものがあれば投稿していきたいと思います。