Rails STI and has_many through association not working, SQLException: no such table

陌路散爱 提交于 2019-12-24 08:34:46

问题


I have the following models:

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

And this is my schema:

 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

When I try in rails console:

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

Practice.last.questions << Question.last

I get this error:

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 (?, ?, ?, ?)

The error is obvious it doesn't find the table practices but how can I fix this? I don't understand how to specify to use the table tests, instead of practices. Any help is appreciated


回答1:


There should be no practices table since Practice inherits Test and you want to use STI pattern. I've repeated your models and schema on my machine and it works as expected. So either you have some problems with SQLite or with things like spring.

Calm down spring with spring stop and then try to recreate db with rails db:reset and make sure there are no errors.

Moreover I hope it is just example codes and in real life you don't name sql relation as relations =)



来源:https://stackoverflow.com/questions/46947051/rails-sti-and-has-many-through-association-not-working-sqlexception-no-such-ta

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!