Railsの外部キーとして特定の列を使用する
Railsでは、外部キーを追加するには、通常
仮に2つのモデルが
我々は、接続する方法が必要です
どこ
私たちは
まず、移動を生成する
我々の移行ファイルは
rails generate migration AddReferenceToXX mm:references
これは、外部キーをXX
テーブルを使用し、mm
モデル属性id
参照カラムとして.しかし、これid
外部キーとして使用したいのではなく、他のカラムを外部キーとして使用したい場合はemail
? この記事では、我々は正確にそのことを学ぶつもりです.仮に2つのモデルが
GmailInbox
and GmailThread
, 彼らの関係GmailInbox
が多いGmailThread
sとaGmailThread
一つに属するGmailInbox
, それで、それは1対多の関係です.我々は、接続する方法が必要です
GmailThread
にGmailInbox
電子メール(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
そしてそれです.Reference
この問題について(Railsの外部キーとして特定の列を使用する), 我々は、より多くの情報をここで見つけました https://dev.to/masroorhussainv/use-a-particular-column-as-a-foreign-key-in-rails-1o0cテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol