144

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

add_column :post, :user, :references

这将创建一个在表中命名user_id的列posts。但是,如果user_id我想要类似的东西而不是author_id呢?我怎样才能做到这一点?

4

6 回答 6

305

对于 Rails 5+

初始定义:

如果要定义Post模型表,则可以在一行中设置references,index和:foreign_key

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

更新现有:

如果要添加对现有表的引用,可以这样做:

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

注意: 的默认值为indextrue。

于 2017-02-05T19:11:12.433 回答
258

Rails 4.2+中,您还可以在 db 中设置外键,这是个好主意

对于简单的关联,这也可以在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"
于 2015-04-11T12:27:29.747 回答
100

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

于 2014-03-13T16:04:29.467 回答
65

手动执行:

add_column :post, :author_id, :integer

但是现在,当您创建belongs_to 语句时,您必须对其进行修改,所以现在您必须调用

def post
    belongs_to :user, :foreign_key => 'author_id'
end
于 2012-12-04T01:28:41.547 回答
53

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

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
于 2015-11-08T06:14:01.163 回答
-3

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)
于 2017-03-30T16:11:29.803 回答