在rails中更改外键列名称

Aza*_*ram 9 ruby-on-rails database-migration rails-migrations

我有一个这样的Project迁移类:

class CreateProjects < ActiveRecord::Migration
 def change
  create_table :projects do |t|
   t.string :title
   t.text :description
   t.boolean :public
   t.references :user, index: true, foreign_key: true

   t.timestamps null: false
  end
 end
end
Run Code Online (Sandbox Code Playgroud)

user_id在项目表中创建一个列名,但我想命名列,owner_id以便我可以使用project.owner而不是project.user.

Ric*_*eck 9

你可以用两种方式做到:

#app/models/project.rb
class Project < ActiveRecord::Base
   belongs_to :owner, class_name: "User", foreign_key: :user_id
end 
Run Code Online (Sandbox Code Playgroud)

要么

$ rails g migration ChangeForeignKeyForProjects

# db/migrate/change_foreign_key_for_projects.rb
class ChangeForeignKeyForProjects < ActiveRecord::Migration
   def change
      rename_column :projects, :user_id, :owner_id
   end
end
Run Code Online (Sandbox Code Playgroud)

然后:

$ rake db:migrate
Run Code Online (Sandbox Code Playgroud)

  • 我很高兴地发现`rename_column`也负责重命名索引. (10认同)
  • 您还可以将 [`change_table`](http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table) 与 `t.rename` 一起使用 (2认同)