Rails控制台:更新属性并保存到DB

时间:2016-05-17 11:22:53

标签: ruby-on-rails

我想更新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:未定义的方法`update_attributes' for main: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

2 个答案:

答案 0 :(得分:1)

你在做什么效率非常低:

Order.all.each do |tname|
  tname.team = User.where(:id => tname.user_id).pluck(:team).shift
end

您按每个订单点击数据库,导致许多查询。此外,通过采摘选择球队是......很奇怪。如果您想获得User并访问其团队,请使用:

User.find_by(id: tname.user_id).team

但是无论如何你应该在一个查询中执行此操作。如果你正确设置关系,这应该做的工作:

Order.joins(:user).update_all('team = users.team')

答案 1 :(得分:0)

奇怪的修复:

通过两个有效的步骤输入:

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

绝对不知道为什么......