Rails STI和has_many通过关联不起作用,SQLException:没有这样的表

时间:2017-10-26 06:15:50

标签: ruby-on-rails ruby associations has-many-through single-table-inheritance

我有以下型号:

class Test < ApplicationRecord
end

class Exam < Test
end

class Practice < Test
  has_many :relations
  has_many :questions, through: :relations
end

class Relation < ApplicationRecord
  belongs_to :practice
  belongs_to :question
end

class Question < ApplicationRecord
  has_many :relations
  has_many :practices, through: :relations
end

这是我的架构:

 create_table "questions", force: :cascade do |t|
    t.string "title"
    t.text "text"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "relations", force: :cascade do |t|
    t.integer "practice_id"
    t.integer "question_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["practice_id"], name: "index_relations_on_practice_id"
    t.index ["question_id"], name: "index_relations_on_question_id"
  end

  create_table "tests", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

当我在rails console中尝试时:

@p = Practice.new
@p.save
@q = Question.new 
@q.save

Practice.last.questions << Question.last

我收到此错误:

Question Load (0.2ms)  SELECT  "questions".* FROM "questions" ORDER BY "questions"."id" DESC LIMIT ?  [["LIMIT", 1]]
   (0.1ms)  begin transaction
  SQL (0.4ms)  INSERT INTO "relations" ("practice_id", "question_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["practice_id", 2], ["question_id", 1], ["created_at", "2017-10-26 06:09:42.581082"], ["updated_at", "2017-10-26 06:09:42.581082"]]
   (0.1ms)  rollback transaction
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: main.practices: INSERT INTO "relations" ("practice_id", "question_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)

错误显而易见,它找不到表practices,但我该如何解决这个问题?我不明白如何指定使用表测试,而不是实践。任何帮助表示赞赏

1 个答案:

答案 0 :(得分:4)

practices继承Practice并且您想要使用STI模式时,应该没有Test表。 我在我的机器上重复了你的模型和架​​构,它按预期工作。因此,您可能会遇到SQLitespring等问题。

使用spring stop冷静下来,然后尝试使用rails db:reset重新创建数据库,并确保没有错误。

此外,我希望它只是示例代码,在现实生活中,你不能将sql关系命名为relations =)