问题
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