ユーザー同士がフォローし合う機能を実装していきます。今回実装する部分のテーブル設計はこんな感じになります。Relationships
テーブルは中間テーブルの役割を担っています。user_id
、follower_id
はどちらも外部キーです。
user_id
はUsers
テーブルというのは理解できたのですが、follower_id
とは??Followers
テーブルなんて作ってないのですが、ある設定をRelationships
テーブルを作るときにすると、follower
を探すときはUsers
テーブルのfollower_id
をみるようになります。以下で説明していきます。
まず最初にRelationship
モデルを作成します。
Sayo-MacBook-Pro:emoji_diary SAYO$ bundle exec rails g model Relationship
Running via Spring preloader in process 14182
invoke active_record
create db/migrate/20210601054908_create_relationships.rb
create app/models/relationship.rb
外部キーのuser_id
カラムとfollower_id
カラムを作成します。ここでuser_id
はフォローする人、follower_id
はフォローされる人を指します。
class CreateRelationships < ActiveRecord::Migration[6.1]
def change
create_table :relationships do |t|
t.references :user
t.references :follower, foreign_key: { to_table: :users }
t.timestamps
t.index [:user_id, :follower_id], unique: true
end
end
end
follower_id
の参照先のテーブルはUsers
テーブルにしてあげたいので、foreign_key: {to_table: :users}
としてあげてます。この設定をしないと存在しないfollower
テーブルを参照してしまいます。この設定をすることで、follower
を探すときはUsers
テーブルのfollower_id
をみるようになります。
t.index [:user_id, :follower_id], unique: true
この記載は、unique
制約で同じ人を2回フォローできないようにするために必要です。
Relationships
テーブル作成完了です。
Sayo-MacBook-Pro:emoji_diary SAYO$ bundle exec rails db:migrate
== 20210601055359 CreateRelationships: migrating ==============================
-- create_table(:relationships)
-> 0.2411s
== 20210601055359 CreateRelationships: migrated (0.2412s) =====================
Users
テーブルとRelationships
テーブルのアソシエーションは複雑なので、フォローする、フォローされるの二つの状況に分けて定義していこうと思います。
User
モデルのアソシエーションの記述は下記のようになります。
Relationship
モデルを通して、follower
情報を参照する。このfollower
情報はRelationship
モデルのアソシエーションで定義しています。