我正在尝试创建一个方法,该方法将在特定时间为所有用户更新列。我正在用'随时'的宝石做这个,但我真的不知道在哪里放置这个方法。
我的用户表格中有一列:我想根据其他方法(成绩)更新成绩。在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
?
答案 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