web-dev-qa-db-ja.com

参照用のadd_column(レール)

私は以下を持っていますRails移行は完璧に動作します(無関係な部分は削除されました):

create_table :comments do |t|
  t.text :body
  t.references :post
end

author列をユーザーのユーザーIDであるcommentsテーブルに追加したいのですが、どうすればいいのかわかりません(ただ、 execute)を使用してMySql固有の構文を記述します。

私はadd_column here を見てきましたが、referencesには言及していません。 TableDefinition#references を実際に見つけましたが、add_columnステートメントでそれを使用する方法がわかりません。

これは可能ですか?また、MySqlの場合、「参照」機能が実際にテーブル間の関係を確立しないのは本当ですか?

60
Dan Rosenstark

これからポイントを得るには遅すぎますが、私は後世のための最善の方法を投稿すると思いました:)

使用する change_table の代わりに create_tableすべてのTableDefinitionの長所を使用して、既に存在するテーブルに列を追加します。

self.up do
  change_table :comments do |t|
    t.references :author
  end
end

これはささいなことのように思えるかもしれませんが、Deviseのような他のgemは独自のカスタムテーブル定義を多用しています。

110
Jaime Bellmyer
add_reference :table_name, :reference, index: true
78

やっと手に入れた

add_column :locations, :state_id , :integer, :references => "states"
34

最初に、次を行います。

script/generate migration AddAuthorIdToComments

生成されたファイルを開き、次の行を追加します。

add_column :comments, :author_id, :integer

次に、モデルファイルで:

class User < ActiveRecord::Base
  has_many :comments, :foreign_key => "author_id"
end

class Comment
  belongs_to :author, :class_name => User
end
21
Milan Novota

これを見てからしばらく経ちましたが、最後に移行が外部キーの作成をサポートしていないことを確認しました。ただし、幸いなことに そのためのプラグインがあります です。これを使用しましたが、うまく機能します。

2
Craig Stuntz

新しい移行では、add_column(:table, :column_name, :type, :options)で列を追加できます。

0
mike