我想从我的工作数据库中提取每个学生的名字和姓氏;这样我就可以继续用新学生更新我的本地数据库。问题是学生的名字和姓氏在不同的行中;因此,当我试图拯救这些学生时,我也会得到两个不同的行。
我尝试使用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
答案 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}为了更多的解释)