如何在Rails 4中的一系列日期创建多个记录

时间:2014-09-21 20:10:47

标签: ruby-on-rails date activerecord ruby-on-rails-4 rails-activerecord

我有两个模型,Project和Event。项目has_many事件。

我想在一个项目后自动创建许多事件after_create。

我的项目模型有两个日期列prep_start和prep_end

我正在尝试在prep_start和prep_end之间找到一组日期

我创建了一个关注点,它应该在创建一个新的@Project之后自动创建事件。我的关注(Add_Events.erb)文件如下所示:

 module AddEvents
 extend ActiveSupport::Concern

   included do
    after_create :event_dates, :add_events
    end

    def event_dates 
      @project = Project.new

     (@project.prep_start..@project.prep_end)
    end
    end

   def add_events

   @event_dates.each do |event_date|
   self.events.create!(occurs_on: event_date)
   end
   end

我无法完成数组。

2 个答案:

答案 0 :(得分:1)

我假设你想每天创建活动,对吧?首先,您需要找到开始日期和结束日期之间的日期数组。有一个非常好的红宝石宝石可以帮助你做到here: IceCube

获得日期数组后,您可以遍历它们并创建事件:

def create_events
   # Assuming you have @event_dates = ["2014-09-20", "2014-09-21", "2014-09-22", "2014-09-23"]
   @event_dates.each do |event_date|
     self.events.create!(event_date: event_date)
   end
end

答案 1 :(得分:1)

Ruby范围(x .. y)是可枚举的对象,这意味着你可以对它们进行.each。

迭代一系列日期工作正常,但迭代一系列日期时间将在范围的开始和结束之间产生每秒。 (它也会发出很多警告,因为日期时间的succ方法已经过时了)

因此,您必须确保您的商品属于日期类型。

在Date,Time,DateTime和TimeWithZone的实例上调用to_date是安全的,下面的例子应该可以解决这个问题

(project.start_at.to_date .. project.end_at.to_date).each do |date|
    Event.create(:occurs_at => date)
end