【问题标题】:(Rails 5.1) Self-join association gives error: no such table(Rails 5.1)自连接关联给出错误:没有这样的表
【发布时间】: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

RoR self-join guide I'm referring to

【问题讨论】:

  • 您使用的是哪个版本的 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


【解决方案1】:

如果员工属于经理,那么你应该有这样的 Manager.employee.create

【讨论】:

    【解决方案2】:

    同时在您的 belongs_to 关联上设置 foreign_key 属性。

    【讨论】:

    • 我认为您可能在您的某个迁移中添加了一些内容,从而引发了该错误。你能展示一下你的迁移是什么样子的吗? (或者你的 schema.rb 文件)?
    猜你喜欢
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多