我有两个模型,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
我无法完成数组。
答案 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