Mysql 编写rake检查模型和数据库,然后更新另一个模型
我试图弄清楚如何编写一个rake任务,该任务将接受模型订阅并检查DB中每行中的每一列。任何列日期为false的行,都会使用某些内容更新用户模型属性。到目前为止,我已经:Mysql 编写rake检查模型和数据库,然后更新另一个模型,mysql,sql,ruby-on-rails,Mysql,Sql,Ruby On Rails,我试图弄清楚如何编写一个rake任务,该任务将接受模型订阅并检查DB中每行中的每一列。任何列日期为false的行,都会使用某些内容更新用户模型属性。到目前为止,我已经: task :check_subscription => :environment do @subscription = Subscription.find(:all) for_each @subscription do |sub| Date.today.strftime('%Y-%m-%d') == sub.ex
task :check_subscription => :environment do
@subscription = Subscription.find(:all)
for_each @subscription do |sub|
Date.today.strftime('%Y-%m-%d') == sub.expiry_date.strftime('%Y-%m-%d')
end
if false
User.subscription.user_id.update_attributed(:plan_id => '200')
end
end
没有真正起作用,我肯定我做得不对
属于用户
您可能可以在一条语句中使用update_all执行此操作:
User.joins(:subscriptions).where("subscriptions.expiry_date < ?", Time.now.beginning_of_day).update_all("users.plan_id = 200")
User.joins(:订阅)。其中(“subscriptions.expiration\u date<?”,Time.now.start\u of\u day)。更新所有(“users.plan\u id=200”)
其他一些想法/想法:
任务:检查订阅=>:环境执行
#选择过期订阅
过期订阅=订阅。其中(“过期日期<?”,时间。现在。开始日期)
#选择所有过期订阅的用户ID。
过期的订阅\u用户\u id=过期的订阅。清除(:用户\u id)
#使用id=过期的\订阅\用户\ id更新所有用户,使其计划\ id为200
update_all({:plan_id=>'200'},{:id=>expired_subscription_User_id})
#删除过期的订阅
已过期的订阅。删除
结束
你说的“不工作”是什么意思?请出示日志。我不认为每个的都是标准的Ruby。同样在Date.today.strftime(“%Y-%m-%d”)==sub.expiration\u Date.strftime(“%Y-%m-%d”)
为什么要将今天的日期与到期日期进行比较,但对结果不做任何处理?而且if false
块将永远不会执行。嘿,谢谢你的提示。是的,这将是一个反复出现的事情,耙子将几乎每天运行一次。我会摆弄你的代码,看看它是否合适。再次感谢你帮我找到了一个起点,你知道我为什么会得到一个SQLite3::SQLException:near“.”:语法错误:
也谢谢你的提示,实际上你的提示没有给出错误,除了NOW()不是SQL之外,但经过一点修改,我想出了类似的东西<代码>#选择过期日期早于当前时间的所有订阅的用户ID。过期订阅用户id=subscription.where(“过期日期<?”,Time.now.start\u of_day)。pull(:user\u id)#使用id=expired\u subscription用户id更新所有用户,使其计划id为200个用户。更新所有({:计划id=>'},{:id=>过期订阅用户id})
有没有办法告诉它在执行“User.update\u all”后删除订阅?只需重新输入订阅。where(“expiration\u date<?”,Time.now.start\u of\u day)
删除过期的订阅。我更新了它,在更新用户计划ID后删除过期的订阅。
task :check_subscription => :environment do
# Select expired subscriptions
expired_subscriptions = Subscription.where("expiry_date < ?", Time.now.beginning_of_day)
# Select user ids of all expired subscriptions.
expired_subscription_user_ids = expired_subscriptions.pluck(:user_id)
# Update all users with id = expired_subscription_user_ids so that their plan_id is 200
User.update_all({:plan_id => '200'}, {:id => expired_subscription_user_ids})
# Delete the expired subscriptions
expired_subscriptions.delete
end