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

我想在 Rails 中创建一个 migration,引用另一个表:

add_column :post, :user, :references

这将在 posts表中创建一个名为 user_id的列。但是,如果我想要的不是 user_id,而是类似于 author_id的东西呢?我该怎么做?

89689 次浏览

手动操作:

add_column :post, :author_id, :integer

但是现在,在创建 properties _ to 语句时,必须修改它,因此现在必须调用

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

在 Rails 4中,当使用 postgreql 和 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 不兼容 Rails5 + ,但是这个功能是由 gem Schema _ auto _ foreign _ key(schema _ plus 的一部分)提供的,它与 Rails5兼容。

Rails 4.2 + 中,你也可以在数据库中设置 外国钥匙,即 这是个好主意

对于简单的关联,也可以在添加 foreign_key: truet.references上完成,但是在这种情况下需要两行。

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


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

如果不使用外键,那么其他表的实际表名是什么并不重要。

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

对于 Rails 5 +

初步定义:

如果你定义你的 Post模型表,你可以在一行中设置 referencesindexforeign_key:

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

现有更新:

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

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

注意: < em > index的默认值为 true。

Alias _ tribute (new _ name,old _ name) 非常方便。 只要创建你的模型和关系:

rails g model Post title user:references

然后编辑模型并添加一个属性别名

alias_attribute :author, :user

在那之后你就可以管理

Post.new(title: 'My beautiful story', author: User.first)