Ruby on Rails不会从关联生成外键

时间:2016-06-06 16:57:47

标签: ruby-on-rails rails-migrations

我有两个设置两个名为' points'和'活动'。我想给桌子点#39;外键' activity_id'通过如下设置关联:

class Activity < ActiveRecord::Base
   belongs_to :user
   has_many :points, dependent: :destroy
   ...
end

class Point < ActiveRecord::Base

    belongs_to :activity

end

此外,我还有以下用于创建点表的迁移文件:

class CreatePoints < ActiveRecord::Migration
  def change
    create_table :points do |t|

      t.integer :activity_id
      t.timestamps null: false
      t.boolean :activities_completed, array: true, default: []
      t.integer :point_value
      t.float :time_left    


    end
  end
end

然而,当我跑

rake db:reset
rake db:migrate
rake db:seed

然后通过

检查表格点
rails c
Point.column_names

然后缺少外键:

irb(main):001:0> Point.column_names
=> ["id", "created_at", "updated_at", "activities_completed", "point_value", "time_left"]

我做错了什么?如何使外键activity_id成为points表的一列?

我是Ruby和Rails的新手。我的Rails版本是4.24。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:0)

您的create table迁移应该有一个“t.belongs_to:activity,index:true”,而不是创建类型为integer的字段activity_id。

答案 1 :(得分:0)

你应该做这样的事情,将activity_id添加到你的积分表。

t.references :activity, index: true, foreign_key: true
#this would have created activity_id column in points

从现在开始,您已经创建了迁移并运行了rake db:migrate,学会从表中删除列。您需要编写迁移以从点表中删除activity_id并再次添加。

rails generate migration RemoveActivityIdFromPoints activity_id:integer
rails g migration AddActivityRefToPoints activity:references

这两个应该为您创建适当的迁移。检查迁移文件夹以确认一切顺利,然后运行rake db:migrate并再次测试。

点击此链接了解有关它的更多信息。 http://guides.rubyonrails.org/active_record_migrations.html

答案 2 :(得分:0)

我发现有一个更基本的问题。在rake db:migrate期间没有执行迁移脚本。因此,我对移民所做的改变是无效的。因此我不得不使用

rake db:migrate:redo VERSION=20160605234351

当我运行此命令时,出现了外键。