Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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 在Rails 3.2中添加外键_Ruby On Rails_Ruby_Ruby On Rails 3_Foreign Keys_Migration - Fatal编程技术网

Ruby on rails 在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语句放在模型中,手

我刚刚继承了一个使用Rails 3.2(!!)的博客平台,我希望添加一些功能。我有两个模型,
文章
问题
,我想把它们联系起来,这样任何
问题
都有很多:文章
,任何
文章
都属于:问题

我已经考虑过使用gem
foreigne
来帮助实现这一点,但我想知道是否有一种方法可以在不添加更多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提供的解决方案应为可接受的解决方案。