如何在创建循环Rails / Ruby中引用先前创建的对象

问题描述 投票:0回答:1

所以我有一个具有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-01-01开始,于2019-01-03结束(持续时间为2天)
  • 我们希望两次重复广告系列1,每周间隔一次(+7天)广告系列2应该在广告系列1(2019-01-10)结束后7天开始,并且具有相同的2天持续时间,因此应该结束2019年1月12日
  • 然后,活动3应在活动2(2019-01-19)结束后7天开始,持续时间为2天,因此应在2019-01-21结束。

所以我有一切工作,除了一个主要的事情 - 我不能完全掌握如何工作循环。

我需要根据父级广告系列为第一个新创建的广告系列设置start_timeend_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

正如我所说,代码运行正常并创建新的广告系列,但新的广告系列日期始终基于父广告系列,而不是之前新创建的广告系列。所以我知道我需要以某种方式调整该循环,但不知道从哪里开始!

会喜欢这个的指导!提前致谢!

ruby-on-rails ruby rake rake-task
1个回答
2
投票

我认为你需要在创建新广告系列后重新分配@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
...
© www.soinside.com 2019 - 2024. All rights reserved.