Rails - Имеет много сквозных значений в таблице соединений, как эффективно сделать это для форм - PullRequest
1 голос
/ 19 сентября 2019

У меня есть приложение для отметки, которое позволяет учителям отмечать поступившие на работу ученики по результатам.

Заявка может либо частично соответствовать, либо полностью соответствовать результатам.

Таким образом, SubmissionX может полностью соответствовать Outcome1частично соответствуют Outcome2 и не соответствуют Outcome3

Таким образом, таблицы выглядят примерно так:

Представление

id

title

....

SubmissionOutcome

submission_id

output_id

частично_met (true / false)

полностью_мет (true / false)

Результат

id

title

.....

Я показываю список всех результатов в курсе.И учитель может проверить, был ли результат частично достигнут или полностью достигнут.

Поскольку я добавляю дополнительную информацию в таблицу соединений (частично или полностью), я в настоящее время перебираю каждый из результатов, еслипредставление не относится к этому результату. Я его создаю:

  def initialized_submission_outcomes(unit:, outcome_group: )
    [].tap do |o|
      unit.outcomes.where(outcome_group: outcome_group).find_each do |outcome|
        if submission_outcome = this_submissions_current_outcomes.find_by(outcome: outcome)
          o << submission_outcome.tap {|submission_outcome| submission_outcome.enable ||= true }
        else
          o << SubmissionOutcome.new(outcome: outcome)
        end
     end
  end

end

и затем приводим в порядок возвращенные параметры в контроллере в before_action:

    params[:submission][:submission_outcomes_attributes].values.each do |evidence_attr|
       evidence_attr[:_destroy] = true if (evidence_attr[:enable] != '1' && evidence_attr[:partially_met] != '1')
    end

Это превращается в кошмар для n + 1 задач.Некоторые курсы могут иметь 400 результатов, поэтому для загрузки формы требуется возраст (25 секунд +).

Мне бы очень понравилось, если бы кто-нибудь мог указать мне на более эффективный способ решения проблемы.

Большое спасибо

1 Ответ

0 голосов
/ 20 сентября 2019

Я не совсем понимаю ваши таблицы, но чтобы избежать зацикливания результатов, вы можете использовать SQL-запрос в select.

select_query = 'outcomes.*, case when <your logic here> then true as partially_met, case when <your logic here> then true as fully_met'

Outcome.joins(:submissions).group('outcome_id').select(select_query)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...