如何将两行中的信息保存为一行?

时间:2018-06-04 22:20:45

标签: ruby-on-rails

我想从我的工作数据库中提取每个学生的名字和姓氏;这样我就可以继续用新学生更新我的本地数据库。问题是学生的名字和姓氏在不同的行中;因此,当我试图拯救这些学生时,我也会得到两个不同的行。

我尝试使用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 :(得分:0)

您可以在NewOcOrderOption条记录上使用group_by 它将返回一个散列,其中order_id为关键字,所有选项(对于此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主键(您可以{{3}为了更多的解释)