LoginSignup
0
1

More than 3 years have passed since last update.

Rails モデル作成時に関連付け(1対多の場合)

Last updated at Posted at 2021-04-14

※ 関連付け(アソシエーション)とは

テーブル間の関係を、モデル上の関係として操作できるようにする事。

【モデル作成時に関連付けを設定する方法】

例として、1人のユーザー(Userモデル)が多くのつぶやき(Tweetモデル)を作成する場合。
※Userモデルはすでに存在しているものとします。

1. Modelの作成

$ rails g model Tweet content:string user:references
user:referencesの指定で、Tweetモデルにuser_idカラムが作成されます。
※references=参照

2. 作成されたマイグレーションファイルの確認

20210414_create_tweets.rb
class CreateTweets < ActiveRecord::Migration[5.2]
  def change
    create_table :tweets do |t|
      t.string :content
      t.references :user, foreign_key: true
      # foreign_key: true 👈 外部キー制約

      t.timestamps
    end
  end
end

※外部キー制約:
 1. Usersテーブルに存在しない値を外部キーとして登録不可
 2. Tweetsテーブルの外部キーに値が登録されているUsersテーブルのレコードは削除不可

3. マイグレーション実行

rails db:migrate

4. shema.rbで確認

app/db/schema.rb
create_table "tweets", tweets: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "content"
    t.bigint "user_id"  # reference型でuser_idカラム生成
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_opinions_on_user_id"
end

5. Tweetモデルを確認・Userモデルを編集

app/models/tweet.rb
class Tweet < ApplicationRecord
  belongs_to :user
end

作成されたtweet.rbにはuserに属する(belongs_to)が記述されます。
これに対して、Userモデルにtweetを所有する(has_many)を追記します。

app/models/user.rb
class User < ApplicationRecord
  has_many :tweets, dependent: :destroy
  # 多数のつぶやきを持つ為、tweetsと複数形にする
end

dependent: :destroyは、先に書いた外部キー制約でエラーが出ない為の設定。
 これにより、Userが削除された場合、属するtweetsも削除されます。

以上の設定で、User has many TweetsTweet belongs to userの関連付けができます。

関連付けしていない・している場合の例

ユーザーのつぶやきを取得
・関連付け無し場合

@user = User.find(params[:id])
Tweets = Tweet.where(user_id: @user.id)

・関連付けした場合

@user = User.find(params[:id])
Tweets = @user.tweets

省略できますね!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1