【问题标题】:How to reference the previously created object in a create loop Rails/Ruby如何在创建循环 Rails/Ruby 中引用先前创建的对象
【发布时间】:2019-08-25 10:54:58
【问题描述】:

所以我有了一个包含 start_time 和 end_time 的广告系列的概念。我正在构建一个小的 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 天)
  • 我们希望每周重复两次活动 1(+7 天)因此,活动 2 应在结束后 7 天开始 活动 1 (2019-01-10),持续时间相同,为 2 天,因此 应该在 2019-01-12 结束
  • 广告系列 3 应在 7 天后开始 活动 2 (2019-01-19) 结束,持续时间相同为 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】:

    我认为您只需要在创建这样的新广告系列后重新分配@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
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-30
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      相关资源
      最近更新 更多