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



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

我尝试用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 个小时了。谢谢。

此外,这一切都发生在我学生的控制器上。

编辑:

原始数据库如下所示

这就是我希望它的样子:

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

您可以在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

但是,请注意,idattr_protected,您应该向 Student 模型添加另一个属性来存储order_id,而不是覆盖id主键(您可以查看这篇文章以获取更多解释(

最新更新