【发布时间】:2018-07-29 22:42:27
【问题描述】:
已修复
适用于 5.0.6
问题出在您的生成器中。
rails g model Employees manager:references
产生错误的迁移。如果您想要修复,请继续阅读。
我对自加入关联有疑问...
class Employee < ApplicationRecord
has_many :subordinates, class_name: "Employee", foreign_key: "manager_id"
belongs_to :manager, class_name: "Employee", optional: true
end
尝试创建“Employee”记录时,出现错误“No such table main.managers”(在底部):
>> Employee.create(name: "Matt")
(0.4ms) begin transaction
SQL (1.5ms) INSERT INTO "employees" ("name", "created_at", "updated_at") VALUES (?, ?, ?) [["name", "Matt"], ["created_at", "2018-02-19 16:38:21.835022"], ["updated_at", "2018-02-19 16:38:21.835022"]]
(0.2ms) rollback transaction
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: main.managers: INSERT INTO "employees" ("name", "created_at", "updated_at") VALUES (?, ?, ?)
代码摘自 RoR 指南。如何更正?
我强调它是一个自连接表。因此没有“Manager”模型或“managers”表。
Rails 版本 5.1.5
解决方案:
这是因为迁移。 使用命令
rails g model Employee name:string manager:references
在 5.0.6 中产生不同的代码。您不能进行这样的迁移:
create_table :employees do |t|
t.string :name
t.references :manager, foreign_key: true #mistake
t.timestamps
end
改成:
t.references :manager, index: true
【问题讨论】:
-
您使用的是哪个版本的 Rails?用 5.0.6 测试了你的代码,一切正常。
-
谢谢,它在 5.0.6 中也适用于我。
-
我刚刚在 Ruby 2.5.0 上安装了 Rails 5.1.5,并且您的模型代码对我使用 gem 版本 1.3.13 的 sqlite3 版本 3.14.2 很好。您的迁移情况如何?
-
谢谢!我的迁移有问题。
-
你节省了我的时间!谢谢!
标签: ruby-on-rails ruby