Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在“中指定列名”;参考资料;迁移_Ruby On Rails_Ruby On Rails 3_Activerecord_Rails Migrations - Fatal编程技术网

Ruby on rails 在“中指定列名”;参考资料;迁移

Ruby on rails 在“中指定列名”;参考资料;迁移,ruby-on-rails,ruby-on-rails-3,activerecord,rails-migrations,Ruby On Rails,Ruby On Rails 3,Activerecord,Rails Migrations,我想在Rails中进行迁移,引用另一个表。通常,我会做以下事情: add_column :post, :user, :references 这将在posts表中创建一个名为user\u id的列。但是如果我想要的不是user\u id,而是author\u id?我如何才能做到这一点?手动操作: add_column :post, :author_id, :integer 但是现在,当您创建BELLENS_to语句时,您必须修改它,所以现在您必须调用 def post belongs

我想在Rails中进行
迁移
,引用另一个表。通常,我会做以下事情:

add_column :post, :user, :references
这将在
posts
表中创建一个名为
user\u id
的列。但是如果我想要的不是
user\u id
,而是
author\u id
?我如何才能做到这一点?

手动操作:

add_column :post, :author_id, :integer
但是现在,当您创建BELLENS_to语句时,您必须修改它,所以现在您必须调用

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

在rails 4中,当使用postgresql和gem时,您只需编写

add_reference :posts, :author, references: :users
这将创建一列
作者id
,该列正确引用
用户(id)

在你的模型中,你写

belongs_to :author, class_name: "User"
注意,创建新表时,可以按如下方式编写:

create_table :things do |t| 
  t.belongs_to :author, references: :users 
end 
注意:
schema_plus
gem整体上与rails 5+不兼容,但此功能由与rails 5兼容的gem(schema_plus的一部分)提供


Rails 4.2+中,也可以在db中设置

对于简单的关联,也可以在
t.references
添加
外键: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"

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

add_reference :posts, :author
从Rails 5开始,如果使用外键,可以在外键选项中指定其他表的名称。(有关讨论,请参阅)

在Rails 5之前,应单独添加外键:

add_foreign_key :posts, :users, column: :author_id
轨道5+ 初步定义: 如果要定义
Post
模型表,可以在一行中设置
参考
索引
外键

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

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

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

注意:索引的默认值为true。

别名属性(新名称、旧名称)非常方便。 只需创建您的模型和关系:

rails g model Post title user:references
然后编辑模型并使用添加属性别名

alias_attribute :author, :user
在那之后,你就可以像

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


我不需要添加任何索引吗?是的,您需要在迁移中创建一个索引。Rails欺骗-默认情况下它实际上不使用索引。现在,如果您想要索引(这是一个好主意——尽管rails会完全忽略它们),那么您当然可以添加索引。您可能想查看指南I链接,了解有关迁移的更多信息,甚至可能在迁移中直接调用SQL代码。我会说忽略它,因为它不是rails的正常部分,您将从中获得0性能,因为rails默认生成的SQL查询没有利用它。嗯,我明白了。非常感谢你!使用
schema\u plus
gem,
t.references:category,index:true,foreign\u key:true,references::match\u categories
在迁移文件中也对我有效。如果您使用
create\u table
t.references:author,引用::用户
将@MichaelRadionov的评论添加到您的答案中会使其更加完美。我一直在查看Rails 4.1的源代码,但我找不到任何证据证明
:引用
确实起到了任何作用。是的,您是对的,我已经使用
schema_plus
gem很久了,它实际上正在添加该功能。我相应地编辑了我的答案。在Rails 6中,语法似乎是
t。references:col\u name,references:other\u table\u name
可以在不安装额外gems的情况下工作。谢谢,但问题被标记为Rails3,我很乐意帮忙哦,我没有注意到这一点。嗯,这对我很有帮助当我看到这个的时候,我几乎放弃了希望!谢谢@Ecologic@Ecologic,您可能想添加一件事,添加_foreign_key仅为rails 4.2+。)我不确定您是否需要
add\u reference
调用中的
references::users
选项。我没有在文档中看到它的文档,没有它,它似乎在我这方面起作用。当您需要定义对另一个模型的多个引用时,这不起作用,例如,post(author,editor)初始定义是否允许空值?如果没有,您知道可为空的选项吗?此定义允许
null
s。若不允许,请添加常用选项
null:false
。谢谢。对于“初始定义”,我认为“index:true”是没有必要的。无论是否使用它,我都会得到相同的模式更改。不要介意;刚刚在结尾看到你的便条。谢谢,这就是我要找的!请注意,
rails g migration addauthortopost author:references
无法输出此信息。您必须手动更新迁移(请参阅:)
Post.new(title: 'My beautiful story', author: User.first)