【167日目】【1日20分のRailsチュートリアル】【第12章】relationshipsテーブルを作成する
今日は「12.1.1 データモデルの問題 (および解決策)」から。
12.1.1 データモデルの問題 (および解決策)
ユーザーをフォローするデータモデル構成のための第一歩として、典型的な場合を検討してみましょう。
まず名前付けとして、
* あるユーザーがフォローしているすべてのユーザーの集合→following
* あるユーザーがフォローされているすべてのユーザーの集合→followers
とするらしい。
うーん、ややこしい。英語って難しい。とりあえずTwitterと一緒にしたのね…。
能動的関係も受動的関係も、最終的にはデータベースの同じテーブルを使うことになります。したがって、テーブル名にはこの「関係」を表す「relationship」を使いましょう。モデル名も同様にして、Relationshipモデルとします。作成したRelationshipデータモデルを図12.8に示します。
なんやかんやあって図12.8の形に落ち着いた、と。
マイグレーション生成しましょう。
$ rails generate model Relationship follower_id:integer followed_id:integer : invoke active_record create db/migrate/20170726030438_create_relationships.rb create app/models/relationship.rb invoke test_unit create test/models/relationship_test.rb create test/fixtures/relationships.yml
このリレーションシップは今後follower_idとfollowed_idで頻繁に検索することになるので、リスト12.1に示したように、それぞれのカラムにインデックスを追加します。
db/migrate/[timestamp]_create_relationships.rb
add_index :relationships, :follower_id add_index :relationships, :followed_id add_index :relationships, [:follower_id, :followed_id], unique: true
リスト12.1では複合キーインデックスという行もあることに注目してください。これは、follower_idとfollowed_idの組み合わせが必ずユニークであることを保証する仕組みです。これにより、あるユーザーが同じユーザーを2回以上フォローすることを防ぎます。
なるほど、確かにあるユーザーが同じユーザーを2回以上フォローすることはないもんね。
ふと気になったけど、フォロー解除したときはレコード消すのかな…?今後出てくるの待とう。
relationshipsテーブルを作成するために、いつものようにデータベースのマイグレーションを行います。
relationshipsテーブル作成できましたー。
$ bundle exec rake db:migrate == 20170726030438 CreateRelationships: migrating ============================== -- create_table(:relationships) -> 0.0016s -- add_index(:relationships, :follower_id) -> 0.0009s -- add_index(:relationships, :followed_id) -> 0.0010s -- add_index(:relationships, [:follower_id, :followed_id], {:unique=>true}) -> 0.0135s == 20170726030438 CreateRelationships: migrated (0.0173s) =====================
今日の学習時間は【26分】。
次は「12.1.2 User/Relationshipの関連付け」から。