NoMethodError:未定义的方法`<<'为零:NilClass
问题描述:
我有一个任务,我没有建立,但不再工作。我是新来的红宝石轨道上,还没有找到这个问题的解决方案呢。NoMethodError:未定义的方法`<<'为零:NilClass
当我运行任务获得:
这是任务:
小调试通控制台
确认有120530个负载转移:
loads = Load.where("pickup < NOW()").count
2014-07-23 12:55:56 DEBUG -- (149.8ms) SELECT COUNT(*) FROM "loads" WHERE (pickup < NOW())
=> 120530
创建空arr AY:
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">]
真的不知道该< <是什么但我认为这只是分布的属性,以便他们可以保存在另一个表
这里**NoMethodError: undefined method `<<' for nil:NilClass**
下一行
loads.each {|load| expired_loads << load.attributes }
错误是:将它们保存到archived_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
我不确定你的任何结构,这仅仅是一个建议,以更简洁的方式。
如果您还在里面使用了<<
方法,也可以谨慎地发布您的ArchivedLoad
的create
方法。如果你还没有实现某种自定义的create
方法,我认为你需要一个迭代,而不是如
expired_loads.map(&:attributes).each{|load| ArchiveLoad.create(load)}
而且<<
类似于push
它添加一个对象的Array