我有两个设置两个名为' 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。任何帮助表示赞赏。
答案 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
当我运行此命令时,出现了外键。