Railsの外部キーとして特定の列を使用する


Railsでは、外部キーを追加するには、通常
rails generate migration AddReferenceToXX mm:references
これは、外部キーをXX テーブルを使用し、mm モデル属性id 参照カラムとして.しかし、これid 外部キーとして使用したいのではなく、他のカラムを外部キーとして使用したい場合はemail ? この記事では、我々は正確にそのことを学ぶつもりです.
仮に2つのモデルがGmailInbox and GmailThread , 彼らの関係GmailInbox が多いGmailThread sとaGmailThread 一つに属するGmailInbox , それで、それは1対多の関係です.
我々は、接続する方法が必要ですGmailThreadGmailInbox 電子メール(Gmailアカウントが電子メールに基づいて特定されるので)に基づきますGmailInbox : 電子メール
どこemail 属性は一意性制約を持ちます(つまり、外部キーの参照列となるため、この列では複製は許可されません).GmailThread : ID , ThreadadID , INBOX
私たちはinbox_email Gmail受信トレイを参照する外部キーとしての属性.
まず、移動を生成する
rails generate migration add_foreign_key_to_gmail_threads
その後、参照テーブルの列に一意性制約を追加する必要があります.その後、GMoreLesスレッドテーブルに外部キーを追加します.
我々の移行ファイルは
def change
  add_index :gmail_inboxes, :email, unique: true
  add_foreign_key :gmail_threads, :gmail_inboxes, column: :inbox_email, primary_key: :email
end
構文説明はadd_index :table_name, :column_name, unique: true add_foreign_key :from_table, :to_table, column: :foreign_key_column, primary_key: :referenced_column最後に必要なのは、我々のモデルに外部キー情報を入れることです.
class GmailThread < ApplicationRecord
  belongs_to :gmail_inbox, foreign_key: 'inbox_email', primary_key: 'email', optional: true
end
そして同じGmailInbox モデル
class GmailInbox < ApplicationRecord
  has_many :gmail_threads, foreign_key: 'inbox_email', primary_key: 'email'
end
そしてそれです.