Как я могу сохранить информацию из двух строк в одну строку? - PullRequest
0 голосов
/ 05 июня 2018

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

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

После этого я попытался сохранить студента, а затем обновить того же самого студента;но он создает новую строку, когда я обновляю его.

Это то, что у меня есть сейчас:

NewOcOrderOption.where("name = 'Student First Name' OR name = 'Student Last Name'").each do |key|
          #binding.pry

          @st = Student.new(student_params)

          @st.id = key.order_id

          @st.first_name = key.value if key.name == "Student First Name"

          @st.save!

          stu = Student.find(@st.id)

          @st.last_name = key.value if key.name == "Student Last Name"

          stu.update_attribute(:last_name, @st.last_name) if @st.last_name != nil

          #@st.save!

        end

Если я плохо объясняю себя, я глубоко извиняюсь.Я занимаюсь этим уже 5 часов.Спасибо.

Кроме того, все это происходит на контроллере моего ученика.

Редактировать:

Исходная база данных выглядит как this

Вот как я хочу, чтобы это выглядело так:

id first_name last_name 4074 Cristian Polanco 4075 Raul Person

Это вывод:

id first_name last_name 4074 Cristian NULL 4074 NULL Polanco 4075 Raul NULL 4075 NULL Person

1 Ответ

0 голосов
/ 05 июня 2018

Вы можете использовать group_by на NewOcOrderOption записях.
Он вернет хеш с order_id в качестве ключа и все опции (для этого идентификатора)в качестве значения:

NewOcOrderOption.all.group_by(&:order_id).each do |id, options|
  student = Student.new
  options.each do |option|
    case option.name
    when 'Student First Name' then student.firstname = option.value
    when 'Student Last Name' then student.lastname = option.value
    end
  end
  student.id = id
  student.save!
end

Однако обратите внимание, что id имеет атрибут attr_protected, и вы должны добавить еще один атрибут в модель Student, чтобы хранить order_id вместо переопределения первичного ключа id (вы можете проверьте этот пост для более подробного объяснения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...