我想更新rails控制台中的现有记录。
Order.all.each do |tname| tname.team = User.where(:id => tname.user_id).pluck(:team).shift end
正在工作,但结果没有保存到数据库中。
两个
Order.all.each do |tname| tname.team = User.where(:id => tname.user_id).pluck(:team).shift self.update_columns(team: tname.team) end
或
Order.all.each do |tname| tname.team = User.where(:id => tname.user_id).pluck(:team).shift self.update_attributes(team: tname.team) end
不工作。(NoMethodError:main的未定义方法"update_attributes":Object)
有什么想法吗?提前感谢!
编辑(架构):
create_table "users", force: :cascade do |t|
t.text "team"
end
create_table "orders", force: :cascade do |t|
t.integer "user_id"
t.string "team"
end
您所做的工作效率很低:
Order.all.each do |tname|
tname.team = User.where(:id => tname.user_id).pluck(:team).shift
end
每一个订单都会访问数据库,从而产生许多查询。此外,通过勇气来选择球队是…wierd。如果你想获得User
并访问其团队,请使用:
User.find_by(id: tname.user_id).team
但无论如何,您都应该在一个查询中执行此操作。如果你正确地设置了关系,这应该可以完成任务:
Order.joins(:user).update_all('team = users.team')
奇怪的修复:
通过在两个步骤中键入它可以工作:
1) Order.all.each do |tname| tname.team = User.where(:id => tname.user_id).pluck(:team).shift
2) tname.save end
代替
Order.all.each do |tname| tname.team = User.where(:id => tname.user_id).pluck(:team).shift tname.save end
。
完全不知道为什么。。