ほげほげパッチ

有る事無い事 徒然なるままに

「.id」か「_id」か

困った

なんか、idが乱用されていて、初心者を惑わせてくる。

結論

  • .id:主キーの取得
  • _id:関連のチェック

解説

  • .id

    • .idはActive Recordオブジェクトのプライマリキー(主キー)を取得する。
      tweet.allとかuser.find()とかの、前半部分がオブジェクト)
    • データベーステーブルには普通idというカラムがある。  
    • ex. Userモデル -> usersテーブル -> idカラム という状態で、
      user.id => userオブジェクトの主キー(id)

  • _id

    • _idは、Active Recordオブジェクト間の関連を表現
    • TweetモデルとUserモデルが存在する場合、Tweetモデルにuser_idというカラムがある。
    • tweet.user_idは、tweetレコードの中のuser_idカラム

  • ActiveRecordメソッド(復習)

    • モデルがテーブル操作に関して使用できるメソッドの総称
    • find all new save...などなど
    • オブジェクトリレーショナルマッピング(Object-Relational Mapping、ORM)の実装。
      • データベースとオブジェクト指向プログラミングの世界をつなぐ

        《chatGPT先生曰く》
        具体的には、Active Recordはデータベーステーブルの各行(レコード)をRubyのオブジェクトにマッピングします。 これにより、データベース操作を直接SQLクエリで行うのではなく、Rubyのコードを使用してより直感的にデータベースとやり取りできるようになります。

      • なんとなく、content.find()とかやってたが、これは "オブジェクト操作の感覚で、データベース操作を行なってた" ということらしい。

サンプルコード

<% if user_signed_in? && current_user.id == @tweet.user_id %>

current_user.id:ヘルパーメソッドcurrent_userの主キー(ID)を取得。
@tweet.user_id:@tweetオブジェクトのユーザーIDカラムを取得。

まとめ

  • .idは、単一のテーブルの単一のレコードから、主キーであるidカラムの情報を取得。
  • _idは、複数のテーブルが関連しているときに、tweetテーブルの中のuser_idカラムみたいに登場する。
  • `XX.xx" = "XX(レコード)のxxカラム"

補足(20230801追記)

  • 主キー:その値を指定すると特定のレコードを一意識別できる属性(NULL不可)
     └検索するのに、ダブりがあると色々不都合あるよね。みたいなキー。    identify:識別

  • 外部キー:テーブルとテーブルを関連づけるキー。
     └よって、参照先の属性に存在する値から選ばれないといけない。
      (ちなみNULLでも可)
     └上記で言うところのuser_id
      (Tweetモデル内からUserモデルを参照。Userモデル内に存在する値。)

  • Active Record
    Railsでは、主キーや外部キーなどのカラムを呼び出す記法が、通常のメソッドと同じ。
    user.id <=> tweet.user_id <=> gets.to_i
    逆に言うと、見た目は同じでも意味合いが全然違う。
    だからややこしい。