Вложенные соединения Rails с has_many через отношения

У меня есть БД, в которой хранятся ответы студентов на вопросы викторины. Они связаны с результатами обучения учащихся, которые я хочу проанализировать с помощью ряда взаимосвязей, описанных ниже. Я пытаюсь подсчитать, на сколько вопросов были даны правильные ответы и на сколько вопросов были даны неправильные ответы для каждого результата обучения учащегося, но я продолжаю получать ошибки. Заранее благодарим вас за любую помощь, которую вы оказываете.

Общее отображение

«Ответ» отвечает на вопрос, который проверяет «тему знаний», охватывающую многие («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

person Katie T    schedule 25.11.2014    source источник
comment
Можете ли вы обновить свой вопрос, добавив миграции для Answer, KtCoveredBySlo? Ваш запрос показывает два разных имени столбца для внешнего ключа KnowledgeTopic.   -  person vee    schedule 25.11.2014
comment
Не могли бы вы также структурировать свои запросы так, чтобы их было легче читать, например, разбив их на несколько строк.   -  person roman-roman    schedule 25.11.2014
comment
Вы пытались следовать соглашению о рельсах и использовать именование snake_case в своих миграциях и объявлениях ассоциаций в моделях, или это не вариант?   -  person ave    schedule 25.11.2014
comment
ave - я думал, что основан на рубиновых руководствах на guides.rubyOnRails.org. атрибуты случая змеи и имена таблиц, но при использовании одной записи в таблице используйте camal case. Это неправильно? Есть место, где я все испортил?   -  person Katie T    schedule 25.11.2014
comment
@KatieT, нет, это не правильно. Вы только (должны) использовать верблюжий регистр для имен классов и модулей. Предлагаю вам прочитать guides.rubyonrails.org/   -  person ave    schedule 25.11.2014
comment
Поправьте меня, если я ошибаюсь: ваши ассоциации показывают, что у KnowledgeTopic есть много-ко-многим с StudentLearningOutcome через таблицу объединения KitCoveredBySlo. Итак, запросить активную запись Answer.joins (: knowledge_topics) - неправильный запрос, поскольку Answers принадлежит к KnowledgeTopics. Какой простой английский запрос вы хотите?   -  person Tom Bartel    schedule 25.11.2014
comment
Для каждого результата обучения ученика я хочу знать, на сколько вопросов Том - ответил правильно, а на сколько - неправильно. Каждый ответ должен быть засчитан для каждого результата обучения студента, который он проверяет (т. Е. Если ответ относится к 3 различным результатам обучения студента, он будет засчитан 3 раза). Спасибо.   -  person Katie T    schedule 25.11.2014
comment
Ave - Мне непонятно, где я не следую этой конвенции? Вы можете привести мне пример?   -  person Katie T    schedule 25.11.2014
comment
@KatieT, в ваших миграциях посмотрите на имена аргументов, которые вы передаете t.reference, а в ваших моделях посмотрите, какие аргументы вы передаете методу belongs_to. Согласно соглашению, они должны быть snake_cased и поэтому должны быть аргументами в запросе.   -  person ave    schedule 26.11.2014


Ответы (1)


Спасибо всем. Используя объяснение Аве, я изменил ссылочные имена, а затем соответствующим образом обновил все остальное. После этого я смог запустить запрос с помощью

@answers = Answer.joins(knowledge_topic: :student_learning_outcomes)
.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)
person Katie T    schedule 02.12.2014