【问题标题】:Trying to iterate an array of dates between two dates in Rails 4尝试在Rails 4中的两个日期之间迭代日期数组
【发布时间】:2014-09-29 21:51:00
【问题描述】:

我对 Rails 很陌生。我正在尝试查找两个日期之间的日期数组,并在创建特定记录后使用 after_create 自动执行此操作。

我有带有列 project.prep_start 和 project.prep_end.... 的模型项目。两者都类型为 Date。

创建项目记录后,我想查找 project.prep_start 和 project.prep_end 之间的日期数组。

最终,我试图自动创建许多事件记录,其中 Event.occurs_on 日期列与 project.prep_start..project.prep_end 数组中的日期相同....但首先我必须找到数组.

我已经编写了这个关注文件...但它不断抛出“undefined method `each' for nil:NilClass”错误,因为(我认为)我没有创建数组。

我尽量不使用任何宝石,而是全力以赴。

我的关注 (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

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

【问题讨论】:

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


    【解决方案1】:

    调用函数event_dates不会自动设置实例变量@event_dates。你应该把它作为一个函数来调用,即没有@。或者,您可以在event_dates 函数中设置实例变量。

    我还看到您正在从 after_create 挂钩调用 event_dates 函数。在这种情况下确实没有必要。

     module AddEvents
       extend ActiveSupport::Concern
    
       included do
         after_create :add_events
       end
    
       def event_dates 
         @project = Project.new
         @project.prep_start..@project.prep_end
       end
    
       def add_events
         event_dates.each do |event_date|
           self.events.create!(occurs_on: event_date)
         end
       end
     end
    

    【讨论】:

    • 嗯...我使用了您的代码,但它一直抛出此错误“无法从 NilClass 迭代”...我真的被卡住了。
    【解决方案2】:

    (Date.current...Date.current+1.month).to_a 是获取日期数组的绝佳方式。

    您在@event_dates.each 所做的是在实例变量“@event_dates”上调用.each 这需要一个值。

    如果你想在模块方法event_dates 的结果上调用它。您必须提供 prep_startprep_end 值(我假设它们在您只调用 .new 后没有)。

    【讨论】:

    • 我现在将它 (event_dates) 称为一个函数,就像 Abraham Chan 在上面的代码中一样,但它一直告诉我“无法从 NilClass 迭代”
    【解决方案3】:

    好的...我让它正常工作。我需要“要求日期”并使用 self.columnname 而不是 model.columnname

     module AddEvents
     extend ActiveSupport::Concern
    
       included do
        after_save :event_dates, :add_events
       end
    
       def event_dates 
        require 'date'      
         (self.prep_start.to_date .. self.prep_end)      
       end
    
       def add_events
         event_dates.each do |event_date|
          self.events.create!(occurs_on: event_date)
         end
       end
    

    结束

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 2021-06-01
      相关资源
      最近更新 更多