更新所有用户方法的列

时间:2015-04-28 08:22:31

标签: ruby-on-rails ruby

我正在尝试创建一个方法,该方法将在特定时间为所有用户更新列。我正在用'随时'的宝石做这个,但我真的不知道在哪里放置这个方法。

我的用户表格中有一列:我想根据其他方法(成绩)更新成绩。在rails控制台中,当我这样做时:

user.update(:grades => user.grade)

这很好用。当我在rails控制台中定义我想要的方法时这样:

def update_grades(users)
 users.each do |user|
  user.update(:grades => user.grade)
 end
end

@users = User.all

update_grades(@users)

此功能也可以更新所有用户的等级。

问题在于我不知道将此方法放在何处以便在我的调度程序中工作。我尝试将它放在user.rb模型文件中,但是当我调用update_grades(@users)时,它给了我这个错误:

NoMethodError: undefined method `update_grades' for main:Object

我将其更改为删除(@users)并尝试调用update_grades@users.update_grades这些都不起作用,我收到此错误:

NoMethodError: private method `update_grades' called for #<User::ActiveRecord_Relation:0x007fbb753b1b58>

我可以将方法放在哪里,以便拨打update_grades(@users)update_grades

1 个答案:

答案 0 :(得分:3)

您可以在User

上将其设为类方法
class User
  def self.update_grades
    all.each do |user|
      user.update(:grades => user.grade)
    end
  end
end

这可以称为User.update_grades a

考虑将其包装在交易中以加快速度:

  def self.update_grades
    transaction do
      all.each do |user|
        user.update(:grades => user.grade)
      end
    end
  end