如何使用日期作为 rake 任务的参数

How to use date as parameters for a rake task

我有一个 rake 任务,如下所示,需要在 import_date 部分输入日期才能执行它。放入 import_date 部分的日期然后保存在 table.

中名为 import_date 的列中
namespace :graduated_member do
  desc 'import member'
  task: create_csv, ['import_date'] => :environment do |task, args|
  #actions

现在,我希望代码仅在输入正确类型的日期时才有效。如果格式错误,我希望它不执行 rake 任务,但给我一个错误代码,告诉我日期格式错误。

# This should work
RAILS_ENV=production ./bin/rake member:create_csv[20201119]

# This shouldn't work, because the date has too many digits.
RAILS_ENV=production ./bin/rake member:create_csv[20200001119]

下面的代码是否适合这样做?

namespace :graduated_member do
  desc 'import member'
  task: create_csv, ['import_date'] => :environment do |task, args|
    require 'date'
    date = Date.today
    if args.worked_on == date.strftime("%Y%m%d")
      # action
    else
     p "ERROR"
    end
  end

更新

我不一定要它比较 'import_date' 和今天的日期的代码,我希望它只是看看用户输入的 'import_date' 是否遵循“%”的规则Y%m%d”。 在这种情况下,下面的代码会更好吗?

namespace :graduated_member do
  desc 'import member'
  task: create_csv, ['import_date'] => :environment do |task, args|
  if args.import_date.strftime("%Y%m%d")
    # action
  else
    p "ERROR"
  end

您可以在字符串上使用 to_date 方法将 args 转换为 Date 对象。然后你可以调用 today? 方法来检查通过的日期。此外,您不需要要求 date 它已经被 Rails 要求。

namespace :graduated_member do
  desc 'import member'
  task :create_csv, ['import_date'] => :environment do |task, args|
    if args['import_date'].to_date.today?
      # action
    else
      p "ERROR"
    end
  end
end

在这种情况下,如果日期格式不正确,您将得到此异常 ArgumentError: invalid date

UPD

如果你想和其他日期比较。

namespace :graduated_member do
  desc 'import member'
  task :create_csv, ['import_date'] => :environment do |task, args|
    if args['import_date'].to_date == Date.new(2020, 11, 26)
      # action
    else
      p "ERROR"
    end
  end
end

如果你想确保你的论点遵循特定的模式

namespace :graduated_member do
  desc 'import member'
  task :create_csv, ['import_date'] => :environment do |task, args|
    Date.strptime(args['import_date'], '%Y%m%d')
      # action
    rescue ArgumentError
      p "ERROR"
  end
end