如何在创建循环中引用之前创建的对象 Rails/Ruby
How to reference the previously created object in a create loop Rails/Ruby
所以我有一个活动的概念,它有一个 start_time 和 end_time。我正在构建一个小的佣金任务,我将根据设定的时间表再次使用该任务 "repeat" 或 "recur" 活动,重复一定次数。
这是 rake 任务的结构以及示例 rake 命令的外观:
$ rake repeatcampaigns:repeatcampaign[:campaign_id, :repeat_times, :repeat_interval]
$ rake repeatcampaigns:repeatcampaign[28,2,monthly]
在上面的这个例子中,我们将采用 ID 为 28 的广告系列并重复两次,从每月开始(即每个新广告系列将在前一个广告系列结束后 30 天开始)。
更详细的示例:
- 广告系列 1 于 2019-01-01 开始并于 2019-01-03 结束(持续时间为 2
天)
- 我们想每周重复一次活动 1 两次 (+7
天)因此,活动 2 应在活动结束后 7 天开始
活动 1 (2019-01-10),持续时间相同,均为 2 天,因此
应该在 2019-01-12
结束
- 广告系列 3 应在 7 天后开始
战役 2 (2019-01-19) 结束,持续时间为 2
天,因此应该在 2019-01-21 结束。
所以我一切正常,除了一件主要的事情 - 我不太明白如何工作循环。
我需要为基于父广告系列的第一个新创建的广告系列设置 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
...
所以我有一个活动的概念,它有一个 start_time 和 end_time。我正在构建一个小的佣金任务,我将根据设定的时间表再次使用该任务 "repeat" 或 "recur" 活动,重复一定次数。
这是 rake 任务的结构以及示例 rake 命令的外观:
$ rake repeatcampaigns:repeatcampaign[:campaign_id, :repeat_times, :repeat_interval]
$ rake repeatcampaigns:repeatcampaign[28,2,monthly]
在上面的这个例子中,我们将采用 ID 为 28 的广告系列并重复两次,从每月开始(即每个新广告系列将在前一个广告系列结束后 30 天开始)。
更详细的示例:
- 广告系列 1 于 2019-01-01 开始并于 2019-01-03 结束(持续时间为 2 天)
- 我们想每周重复一次活动 1 两次 (+7 天)因此,活动 2 应在活动结束后 7 天开始 活动 1 (2019-01-10),持续时间相同,均为 2 天,因此 应该在 2019-01-12 结束
- 广告系列 3 应在 7 天后开始 战役 2 (2019-01-19) 结束,持续时间为 2 天,因此应该在 2019-01-21 结束。
所以我一切正常,除了一件主要的事情 - 我不太明白如何工作循环。
我需要为基于父广告系列的第一个新创建的广告系列设置 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
...