У меня есть БД, в которой хранятся ответы студентов на вопросы викторины. Они связаны с результатами обучения учащихся, которые я хочу проанализировать с помощью ряда взаимосвязей, описанных ниже. Я пытаюсь подсчитать, на сколько вопросов были даны правильные ответы и на сколько вопросов были даны неправильные ответы для каждого результата обучения учащегося, но я продолжаю получать ошибки. Заранее благодарим вас за любую помощь, которую вы оказываете.
Общее отображение
«Ответ» отвечает на вопрос, который проверяет «тему знаний», охватывающую многие («KtCoveredBySLO») «StudentLearningOutcome»
Мои модели имеют следующие отношения:
class Answer < ActiveRecord::Base
belongs_to :KnowledgeTopic
end
class KnowledgeTopic < ActiveRecord::Base
has_many :answers
has_many :kt_covered_by_slos
has_many :student_learning_outcomes, through: :kt_covered_by_slos
end
class KtCoveredBySlo < ActiveRecord::Base
belongs_to :StudentLearningOutcome
belongs_to :KnowledgeTopic
end
class StudentLearningOutcome < ActiveRecord::Base
has_many :kt_covered_by_slos
has_many :knowledge_topics, through: :kt_covered_by_slos
end
Запрос, который я пытаюсь выполнить:
@answers = Answer.joins(:KnowledgeTopic => {:kt_covered_by_slos => :StudentLearningOutcome})
.select( 'student_learning_outcomes.id As student_learning_outcomes_id',
:is_correct, "count(answers.id) AS total_answers")
.group('student_learning_outcomes.id', :is_correct)
Я получаю следующую ошибку:
SQLite3 :: SQLException: такого столбца нет: kt_covered_by_slos.knowledge_topic_id: SELECT student_learning_outcomes.id Как student_learning_outcomes_id, "ответы". "Is_correct", count (answers.id) AS total_answers FROM "answers" INNER JOIN "knowledge_topics. "id" = "answers". "KnowledgeTopic_id" ВНУТРЕННЕЕ СОЕДИНЕНИЕ "kt_covered_by_slos" ON "kt_covered_by_slos". "knowledge_topic_id" = "knowledge_topics". "id"
ВНУТРЕННЕЕ СОЕДИНЕНИЕ "student_learning_outcomes" ON "student_learning_outcomes". kt_covered_by_slos "." StudentLearningOutcome_id "ГРУППА ПО student_learning_outcomes.id, is_correct
Миграции:
class CreateKtCoveredBySlos < ActiveRecord::Migration
def change
create_table :kt_covered_by_slos do |t|
t.references :StudentLearningOutcome, index: true
t.references :KnowledgeTopic, index: true
t.timestamps
end
end
end
class CreateAnswers < ActiveRecord::Migration
def change
create_table :answers do |t|
t.references :Question, index: true
t.references :Section, index: true
t.references :Student, index: true
t.references :KnowledgeTopic, index: true
t.boolean :is_correct
t.string :answer_text
t.references :Enroll, index: true
t.timestamps
end
end
end
class CreateKnowledgeTopics < ActiveRecord::Migration
def change
create_table :knowledge_topics do |t|
t.string :knowledge_area
t.string :knowledge_unit
t.string :knowledge_topic
t.integer :year_added
t.boolean :active
t.integer :correct_answers
t.integer :incorrect_answers
t.integer :temp_correct_answer
t.integer :temp_incorrect_answer
t.timestamps
end
end
end
class CreateStudentLearningOutcomes < ActiveRecord::Migration
def change
create_table :student_learning_outcomes do |t|
t.string :accredidation_body
t.string :title
t.string :description
t.integer :year_added
t.boolean :active
t.integer :correct_answers
t.integer :incorrect_answers
t.integer :temp_correct_answer
t.integer :temp_incorrect_answer
t.timestamps
end
end
end
Answer
,KtCoveredBySlo
? Ваш запрос показывает два разных имени столбца для внешнего ключаKnowledgeTopic
. - person vee   schedule 25.11.2014t.reference
, а в ваших моделях посмотрите, какие аргументы вы передаете методуbelongs_to
. Согласно соглашению, они должны быть snake_cased и поэтому должны быть аргументами в запросе. - person ave   schedule 26.11.2014