Ruby on rails 在Rails 3.2中添加外键
我刚刚继承了一个使用Rails 3.2(!!)的博客平台,我希望添加一些功能。我有两个模型,Ruby on rails 在Rails 3.2中添加外键,ruby-on-rails,ruby,ruby-on-rails-3,foreign-keys,migration,Ruby On Rails,Ruby,Ruby On Rails 3,Foreign Keys,Migration,我刚刚继承了一个使用Rails 3.2(!!)的博客平台,我希望添加一些功能。我有两个模型,文章和问题,我想把它们联系起来,这样任何问题都有很多:文章,任何文章都属于:问题 我已经考虑过使用gemforeigne来帮助实现这一点,但我想知道是否有一种方法可以在不添加更多gem的情况下实现这一点。我环顾四周,看到了一些相互矛盾的东西。似乎只适用于Rails 4,我想它会自动生成这种迁移 我可以通过迁移在两个模式中创建适当的整数字段,然后将has\u many和allow\u to语句放在模型中,手
文章
和问题
,我想把它们联系起来,这样任何问题
都有很多:文章
,任何文章
都属于:问题
我已经考虑过使用gemforeigne
来帮助实现这一点,但我想知道是否有一种方法可以在不添加更多gem的情况下实现这一点。我环顾四周,看到了一些相互矛盾的东西。似乎只适用于Rails 4,我想它会自动生成这种迁移
我可以通过迁移在两个模式中创建适当的整数字段,然后将has\u many
和allow\u to
语句放在模型中,手动完成这项工作吗
非常感谢 编辑:Rails 4
这正是您应该做的:为添加issue_id列的文章生成迁移:
$ rails g migration AddIssueToArticle issue:references
这将生成一个如下所示的迁移,它将添加issue_id列并创建一个索引:
class AddIssueToArticle < ActiveRecord::Migration
def change
add_reference :articles, :issue, index: true
end
end
class AddIssueIdToArticle < ActiveRecord::Migration
def change
add_column :articles, :issue_id, :integer
add_index :articles, :issue_id
end
end
编辑生成的迁移并添加索引:
class AddIssueToArticle < ActiveRecord::Migration
def change
add_reference :articles, :issue, index: true
end
end
class AddIssueIdToArticle < ActiveRecord::Migration
def change
add_column :articles, :issue_id, :integer
add_index :articles, :issue_id
end
end
然后将关系添加到文章和问题类:
# ./app/models/article.rb
class Article
belongs_to :issue
# ... the rest of the class
end
# ./app/models/issue.rb
class Issue
has_many :articles
# ... the rest of the class
end
如果您的类有名称空间,或者整数列是不同的名称,那么您需要向所属的和有许多方法参数添加更多数据
有关生成迁移的更多信息,请参见(和)。这是我为在Rails 3.2中添加多个外键而编写的代码片段
class ChangeAdminUsersEmployee < ActiveRecord::Migration
def up
ActiveRecord::Base.transaction do
tables = %i[admin_users]
reference = 'employee'
tables.each do |table|
p sql = <<-SQL
ALTER TABLE `#{table}`
ADD CONSTRAINT `#{table}_#{reference}_fk`
FOREIGN KEY (`#{reference}_id`) REFERENCES `#{reference}s`(`id`);
SQL
p ActiveRecord::Base.connection.execute(sql)
puts "===="
end
end
end
def down
raise NotImplementedError
end
end
class ChangeAdminUsersEmployee 哦!我的答案适用于4.0项目。正在编辑以获得更好的3.2支持。在这里遇到了一些问题。当我运行rails g migration AddIssueIdToArticle issue:references
时,rails 3.2为我提供了以下迁移:class AddIssueIdToArticlerakedb:migrate
时,我在第1行:ALTER TABLE“articles”ADD COLUMN“issue”references
中的引用中遇到了一个Postgres语法错误。我尝试了上面提供的迁移,但是add\u reference
不是Rails 3.2的一部分。思想?非常感谢!您针对Rails 3.2的解决方案没有添加外键,只是添加了一个索引,还是我遗漏了什么?@Ecologic查看3.2的第二部分,迁移有以下内容:add\u column:articles,:issue\u id,:integer
,它添加了外键。此解决方案没有添加外键,只是添加了一个索引。@Ecologic提供的解决方案应为可接受的解决方案。