簡體   English   中英

NoMethodError:未定義的方法'<<'為nil:NilClass

[英]NoMethodError: undefined method `<<' for nil:NilClass

我有一個尚未構建的任務,但不再起作用。 我是紅寶石的新手,還沒有找到解決此問題的方法。

當我運行任務時,我得到:

這是任務:

  desc "Archive Loads/Trucks that have expired."
  task :expire_old_posts => :environment do
    expired_loads = []
    loads = Load.where("pickup < NOW()")
    loads.each {|load| expired_loads << load.attributes } 
    ArchivedLoad.create( expired_loads )
    loads.delete_all
  end

通過控制台進行少許調試

確認有120530負載要轉移:

loads = Load.where("pickup < NOW()").count    
2014-07-23 12:55:56 DEBUG --    (149.8ms)  SELECT COUNT(*) FROM "loads" WHERE (pickup < NOW())
 => 120530

創建空數組:

expired_loads = []
=> []

運行where命令

loads = Load.where("pickup < NOW()")

很多記錄...我將其限制為兩個以進行測試

1.9.3-p547 :006 > loads = Load.where("pickup < NOW()").limit(2)
2014-07-23 13:02:07 DEBUG --   Load Load (74.2ms)  SELECT "loads".* FROM "loads" WHERE (pickup < NOW()) LIMIT 2
 => [#<Load id: 18398947, user_id: 11074, origin: #<RGeo::Geographic::SphericalPointImpl:0x595f056 "POINT (-80.48237609863281 37.772544860839844)">, dest: #<RGeo::Geographic::SphericalPointImpl:0x595ec64 "POINT (-78.30302429199219 40.295894622802734)">, length: 48, comments: "~PostEverywhere_20140721140916~", ltl: false, rate: nil, delivery: "2014-07-22 17:00:00", pickup: "2014-07-21 17:00:00", weight: 48, equipment_id: 8, covered: false, created_at: "2014-07-21 19:16:16", updated_at: "2014-07-21 19:16:16", owner: nil, deleted: false, origin_city: "ronceverte", origin_state: "wv", dest_city: "martinsburg", dest_state: "pa">, #<Load id: 18398948, user_id: 11074, origin: #<RGeo::Geographic::SphericalPointImpl:0x553cd2a "POINT (-81.035400390625 37.384891510009766)">, dest: #<RGeo::Geographic::SphericalPointImpl:0x553c9d8 "POINT (-79.80570983886719 40.317527770996094)">, length: 48, comments: "~PostEverywhere_20140721140916~", ltl: false, rate: nil, delivery: "2014-07-22 17:00:00", pickup: "2014-07-21 17:00:00", weight: 48, equipment_id: 8, covered: false, created_at: "2014-07-21 19:16:16", updated_at: "2014-07-21 19:16:16", owner: nil, deleted: false, origin_city: "princeton", origin_state: "wv", dest_city: "greenock", dest_state: "pa">] 

真的不確定<<是什么,但是我認為這只是分配屬性,以便可以將它們保存在另一個表中

loads.each {|load| expired_loads << load.attributes } 

這里的錯誤

**NoMethodError: undefined method `<<' for nil:NilClass**

下一行是:將它們保存到archived_loads表中,並從loads表中刪除

ArchivedLoad.create( expired_loads )
loads.delete_all

為什么不使用#map呢? expired_loads = loads.map(&:attributes)或更好的方法是在Load創建一個方法來對其進行存檔,例如

class Load
  scope :expired_loads, -> {where("pickup < NOW()")}
  def self.archive_now
    ArchiveLoad.create(expired_loads.map(&:attributes))
    expired_loads.delete_all
  end        
end

然后,您可以調用Loads.archive_now我不確定您的任何結構,這只是對更簡潔實現的建議。

如果您還利用了<<方法,則最好在其中發布ArchivedLoadcreate方法。 如果您尚未實現某種自定義create方法,那么我認為您需要進行迭代,例如

expired_loads.map(&:attributes).each{|load| ArchiveLoad.create(load)}

另外<<push類似,它將對象添加到Array的末尾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM