我有一个带有cron作业的rails 4 app,每天运行一次以下任务:
task :update_packs => :environment do
@all_users = User.all
@all_users.each do |user|
today = where(:created_at => (Time.now.beginning_of_day..Time.now))
@packs = user.default_packs
if user.packs.today.count >= 1
puts "ERROR: User already has a record today."
else
user.packs.create(:amount => @packs)
end
end
end
但是,当我运行任务时,我收到以下错误:
NoMethodError: undefined method `where' for main:Object
/home/ben/rails_projects/hartwig/lib/tasks/packs.rake:7:in `block (2 levels) in <top (required)>'
/home/ben/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.0/lib/active_record/relation/delegation.rb:46:in `each'
/home/ben/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.0/lib/active_record/relation/delegation.rb:46:in `each'
/home/ben/rails_projects/hartwig/lib/tasks/packs.rake:6:in `block in <top (required)>'
/home/ben/.rvm/gems/ruby-2.1.1/bin/ruby_executable_hooks:15:in `eval'
/home/ben/.rvm/gems/ruby-2.1.1/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => update_packs
我尝试用条件替换 where ,但是我得到了同样的错误。有任何想法吗?
答案 0 :(得分:4)
您需要在您查询的课程上致电where
。 (例如User.where(...)
)
例如,要迭代今天创建的所有用户,您需要:
task :update_packs => :environment do
User.where(:created_at => (Time.now.beginning_of_day..Time.now)).each do |user|
...
end
end
答案 1 :(得分:4)
像这样写你的循环:
@all_users.each do |user|
@packs = user.default_packs
if user.packs.where(:created_at => (Time.now.beginning_of_day..Time.now).exists?
puts "ERROR: User already has a record today."
else
user.packs.create(:amount => @packs)
end
end
但我强烈建议您在Pack
模型中添加范围:
class Pack < ActiveRecord::Base
scope :today, -> { where(:created_at => (Time.now.beginning_of_day..Time.now)) }
end
然后你的任务看起来像:
@all_users.each do |user|
@packs = user.default_packs
if user.packs.today.exists?
puts "ERROR: User already has a record today."
else
user.packs.create(:amount => @packs)
end
end