运行rake db:schema:dump后,在rails schema.rb文件中缺少ruby中的外键

时间:2014-05-15 02:20:52

标签: mysql ruby-on-rails foreign-keys rake

我有一个数据模型生成脚本,通过调用mysql命令行实用程序可以正常工作。我希望RoR使用这个包含表中几个外键依赖关系的数据模型。我发现$ rake db:schema:dump创建了db / schema.rb文件但确实如此,但它缺少所有外键约束/子句。这显然是个问题。

我已经在lynda.com上观看了RoR教程,并且foriegn密钥功能非常基本,并且假设有许多约定,例如只有一个外键,它需要有一个table1_table2_id的命名约定或者其他东西

我昨天在#rubyonrails频道的IRC上聊天,有一个人说RoR忽略了foriegn键和rake db:schema:dump似乎正在这样做。

例如,这是mysql语句:

CREATE TABLE IF NOT NOT EXISTS students(   studentid INT NOT NULL AUTO_INCREMENT,   teacherid INT NOT NULL,   parentid INT NULL,   firstname VARCHAR(45)NOT NULL,   lastname VARCHAR(45)NOT NULL,   dob DATETIME非空,   isadult TINYINT(1)NOT NULL,   email VARCHAR(45)NOT NULL,   cellphone INT NULL,   username VARCHAR(45)NOT NULL,   password VARCHAR(45)NOT NULL,   addr_streetno VARCHAR(45)NULL,   addr_aptno INT NULL,   addr_city VARCHAR(45)NULL,   addr_state VARCHAR(45)NULL,   addr_zip INT NULL,   photo MEDIUMBLOB NULL,   PRIMARY KEY(studentid),   INDEX parentid_idxparentid ASC),   INDEX teacherid_idxteacherid ASC),   约束parentid     外键(parentid)     参考parentsparentid)     无法删除操作     更新没有行动,   约束teacherid     外键(teacherid)     参考teachersteacherid)     无法删除操作     更新无动作) ENGINE = InnoDB;

在schema.rb中,它显示为this,并且没有任何外键指令。是什么给了:

create_table "students", primary_key: "studentid", force: true do |t|
   t.integer  "teacherid",                      null: false
   t.integer  "parentid"
   t.string   "firstname",     limit: 45,       null: false
   t.string   "lastname",      limit: 45,       null: false
   t.datetime "dob",                            null: false
   t.boolean  "isadult",                        null: false
   t.string   "email",         limit: 45,       null: false
   t.integer  "cellphone"
   t.string   "username",      limit: 45,       null: false
   t.string   "password",      limit: 45,       null: false
   t.string   "addr_streetno", limit: 45
   t.integer  "addr_aptno"
   t.string   "addr_city",     limit: 45
   t.string   "addr_state",    limit: 45
   t.integer  "addr_zip"
   t.binary   "photo",         limit: 16777215
end

add_index "students", ["parentid"], name: "parentid_idx", using: :btree
add_index "students", ["teacherid"], name: "teacherid_idx", using: :btree

1 个答案:

答案 0 :(得分:-1)

在Rails中,放置foreign key的位置取决于模型的关联。

我们假设您有以下两种模式:

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belongs_to :parent
end

外键将放在声明belongs_to关联的表中。在这种情况下,children表。

外键是带有后缀parent model的{​​{1}}的名称。在这种情况下,它将是_id

在Rails中,您可以将parent_id添加到parent_id

children_table

然后运行rails g migration AddParentIdToChild parent_id:integer 。之后,外键应显示在rake db:migrate

我希望我没有误解你的问题 有关外键和表的更多信息,请参阅documentation