回答:
手動で行う:
add_column :post, :author_id, :integer
しかし、今、belongs_toステートメントを作成するときは、それを変更する必要があるため、次のように呼び出す必要があります。
def post
belongs_to :user, :foreign_key => 'author_id'
end
schema_plus
gem を使用t.references :category, index: true, foreign_key: true, references: :match_categories
して、マイグレーションファイルでも動作しました。
あなたが定義している場合はPost
、モデルのテーブルを、あなたが設定することができreferences
、index
かつforeign_key
1行で:
t.references :author, index: true, foreign_key: { to_table: :users }
既存のテーブルへの参照を追加する場合、これを行うことができます:
add_reference :posts, :author, foreign_key: { to_table: :users }
注: のデフォルト値index
はtrueです。
null
sを使用できます。それらを許可しない場合は、通常のオプションを追加しますnull: false
。
Rails 4.2 +あなたも設定することができ、外部キーを、DB内にも素晴らしいアイデアです。
単純な関連付けの場合、これはをt.references
追加するforeign_key: true
ときにも実行できますが、この場合は2行必要です。
# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id
# The model
belongs_to :author, class_name: "User"
references: :users
オプションが必要かわかりませんadd_reference
。私はそれがドキュメントに文書化されているのを見ません、そしてそれなしで私の側で動作するようです。
Rails 4では、postgresqlとschema_plus gemを使用すると、次のように書くことができます
add_reference :posts, :author, references: :users
これにより、author_id
正しく参照する列が作成されusers(id)
ます。
そして、あなたのモデルでは、あなたは書きます
belongs_to :author, class_name: "User"
新しいテーブルを作成するときは、次のように書くことができます。
create_table :things do |t|
t.belongs_to :author, references: :users
end
注:
schema_plus
gemは完全にrails 5+と互換性がありませんが、この機能は、rails 5と互換性のあるgem schema_auto_foreign_keys(schema_plusの一部)によって提供されます。
create_table
:t.references :author, references: :users
:references
実際に何かをしている証拠を見つけることができません。
schema_plus
古くからこの宝石を使用しており、実際にその機能を追加しています。私はそれに応じて私の答えを編集しました。
t.references :col_name, references: other_table_name
追加のgemをインストールしなくても構文が機能するようです。
外部キーを使用していない場合は、他のテーブルの実際のテーブル名が何であるかは関係ありません。
add_reference :posts, :author
Rails 5以降、外部キーを使用している場合は、外部キーオプションで他のテーブルの名前を指定できます。(議論についてはhttps://github.com/rails/rails/issues/21563を参照してください)
add_reference :posts, :author, foreign_key: {to_table: :users}
Rails 5以前は、外部キーを個別のステップとして追加する必要があります。
add_foreign_key :posts, :users, column: :author_id
{to_table: :users}
alias_attribute(new_name、old_name)は非常に便利です。モデルと関係を作成するだけです。
rails g model Post title user:references
次に、モデルを編集して、属性エイリアスを追加します
alias_attribute :author, :user
その後、次のようなものを実行できるようになります
Post.new(title: 'My beautiful story', author: User.first)