所以我有一个具有start_time和end_time的Campaign的概念。我正在建立一个小的rake任务,我将用它来重复“重复”或“重复”该活动,再次按照既定的时间表重复一次。
这是rake任务的结构以及示例rake命令的外观:
$ rake repeatcampaigns:repeatcampaign[:campaign_id, :repeat_times, :repeat_interval]
$ rake repeatcampaigns:repeatcampaign[28,2,monthly]
在上面的这个示例中,我们将使用ID为28的广告系列,并每月开始重复两次(即每个新广告系列将在前一个广告系列结束后30天开始)。
更详细的例子:
所以我有一切工作,除了一个主要的事情 - 我不能完全掌握如何工作循环。
我需要根据父级广告系列为第一个新创建的广告系列设置start_time
和end_time
(如下面的代码所示),但对于循环中的每个新广告系列,它应该从循环中引用先前创建的新广告系列。
desc 'Repeat campaigns'
namespace :repeatcampaigns do
desc 'Repeat and publish a campaign X number of times again'
task :repeatcampaign, [:campaign_id, :repeat_times, :repeat_interval] => [:environment] do |_t, args|
@parent_campaign = Campaign.find(args[:campaign_id])
times_to_repeat = args[:repeat_times].to_i
repeat_interval = args[:repeat_interval]
@days_to_add_to_start_time = convert_interval_to_days_for_repeat(repeat_interval)
# Create X new campaigns based on the schedule input
times_to_repeat.times do |index|
@start_time = @parent_campaign.end_time + @days_to_add_to_start_time.days
@new_campaign = Campaign.create(
:name => "Repeat of campaign #{index}",
:start_time => @start_time,
:end_time => @start_time + @parent_campaign.duration_in_days.days
)
end
end
def convert_interval_to_days_for_repeat(repeat_interval)
case repeat_interval
when "daily"
return 1
when "weekly"
return 7
when "monthly"
return 30
end
end
end
正如我所说,代码运行正常并创建新的广告系列,但新的广告系列日期始终基于父广告系列,而不是之前新创建的广告系列。所以我知道我需要以某种方式调整该循环,但不知道从哪里开始!
会喜欢这个的指导!提前致谢!
我认为你需要在创建新广告系列后重新分配@parent_campaign
:
...
@new_campaign = Campaign.create(
:name => "Repeat of campaign #{index}",
:start_time => @start_time,
:end_time => @start_time + @parent_campaign.duration_in_days.days
)
@parent_campaign = @new_campaign
...