beugisma
beugisma

Reputation: 115

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

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

Upvotes: 1

Views: 429

Answers (1)

bernstein7
bernstein7

Reputation: 111

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 =)

Upvotes: 4

Related Questions