ruby-on-rails - 如何在创建循环 Rails/Ruby 中引用先前创建的对象
问题描述
所以我有了一个具有 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 天开始)。
更详细的例子:
- 活动 1 于 2019 年 1 月 1 日开始,于 2019 年 1 月 3 日结束(持续 2 天)
- 我们希望以每周间隔(+7 天)重复活动 1 两次,因此活动 2 应在活动 1(2019-01-10)结束后 7 天开始,并且持续时间相同,为 2 天,因此应在2019-01-12
- 然后,活动 3 应在活动 2 (2019-01-19) 结束后 7 天开始,持续时间相同,为 2 天,因此应在 2019-01-21 结束。
因此,除了一件重要的事情外,我的一切都正常工作-我无法完全掌握如何工作循环。
我需要根据父广告系列为第一个新创建的广告系列设置start_time
and 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
...
推荐阅读
- javascript - 正则表达式删除javascript中重复的相邻字符
- git - Git推送到Github显示漏洞,但我已经更新了包并且信息页面是404
- google-apps-script - 如何根据日期值将一行移动到另一个工作表
- r - R函数对每年特定年龄的值求和
- css - 如何对齐a内的文本水平元素?
- python - 在被点击时发出 QTableWidgetItem 特定的信号
- go - How do decorate mux subrouter similar to http.Handler?
- javascript - React - 导入待办事项但我在文件中看不到它
- python - Python/TensorFlow/Keras - Input to reshape is a tensor with 300 values, but the requested shape has 200 [[{{node decoder_1/reshape_1/Reshape}}]]
- c++ - C++ 中的构造函数可以是抽象的吗?