Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 编写rake检查模型和数据库,然后更新另一个模型_Mysql_Sql_Ruby On Rails - Fatal编程技术网

Mysql 编写rake检查模型和数据库,然后更新另一个模型

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

我试图弄清楚如何编写一个rake任务,该任务将接受模型订阅并检查DB中每行中的每一列。任何列日期为false的行,都会使用某些内容更新用户模型属性。到目前为止,我已经:

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
没有真正起作用,我肯定我做得不对

  • 我有两个型号,分别是Subscription.rb和User.rb
  • DB中的订阅有一个名为expiry\u date的列
  • 用户有一个列plan_id,如果订阅为false(过期),则该id应更新为“200”
  • 订阅具有列用户id,订阅模型具有
    属于用户

  • 您可能可以在一条语句中使用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”)
    
    其他一些想法/想法:

  • 您也可以只执行一个普通的SQL update语句
  • 如果这是一次性转换,那么可能应该在迁移中进行,而不是在独立的rake任务中进行
  • 如果这是一个重复发生的事情,那么您需要包括一些可以调用任务的调度组件
  • 任务:检查订阅=>:环境执行
    #选择过期订阅
    过期订阅=订阅。其中(“过期日期<?”,时间。现在。开始日期)
    #选择所有过期订阅的用户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