ぞえの技術めも

Ruby on Rails勉強中

【167日目】【1日20分のRailsチュートリアル】【第12章】relationshipsテーブルを作成する

Ruby on Railsチュートリアル(第3版)

今日は「12.1.1 データモデルの問題 (および解決策)」から。

12.1.1 データモデルの問題 (および解決策)

ユーザーをフォローするデータモデル構成のための第一歩として、典型的な場合を検討してみましょう。

まず名前付けとして、
* あるユーザーがフォローしているすべてのユーザーの集合→following * あるユーザーがフォローされているすべてのユーザーの集合→followers とするらしい。
うーん、ややこしい。英語って難しい。とりあえずTwitterと一緒にしたのね…。

能動的関係も受動的関係も、最終的にはデータベースの同じテーブルを使うことになります。したがって、テーブル名にはこの「関係」を表す「relationship」を使いましょう。モデル名も同様にして、Relationshipモデルとします。作成したRelationshipデータモデルを図12.8に示します。

なんやかんやあって図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の関連付け」から。