在“引用”迁移中指定列名称

时间:2012-12-04 01:20:45

标签: ruby-on-rails ruby-on-rails-3 activerecord rails-migrations

我想在Rails中创建migration,引用另一个表。通常,我会做类似的事情:

add_column :post, :user, :references

这会在user_id表中创建一个名为posts的列。但是,如果我想要user_id而不是author_id,那该怎么办?我怎么能这样做?

6 个答案:

答案 0 :(得分:228)

Rails 4.2 + 中,您也可以在数据库中foreign keys设置which is a great idea

对于简单关联,这也可以在t.references添加foreign_key: true时完成,但在这种情况下,您需要两行。

# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id

# The model
belongs_to :author, class_name: "User"

答案 1 :(得分:185)

对于Rails 5 +

初步定义:

如果您要定义Post模型表,可以在一行中设置referencesindexforeign_key

t.references :author, index: true, foreign_key: { to_table: :users }

更新现有:

如果要添加对现有表的引用,可以执行以下操作:

add_reference :posts, :author, foreign_key: { to_table: :users }

注意: index的默认值为true。

答案 2 :(得分:80)

在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+不兼容,但此功能由gem schema_auto_foreign_keys(schema_plus的一部分)提供,它与rails 5兼容。

答案 3 :(得分:52)

手动执行:

add_column :post, :author_id, :integer

但现在,当你创建belongs_to语句时,你将不得不修改它,所以现在你必须调用

def post
    belongs_to :user, :foreign_key => 'author_id'
end

答案 4 :(得分:47)

如果您没有使用外键,那么另一个表的实际表名是什么并不重要。

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

答案 5 :(得分:-2)

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)