所以我在使用DataMapper和对象关联方面遇到了一些麻烦。 (代码在底部提供)。我在保存到某些id没有设置的程度上遇到错误,我认为这与我如何设置关联/不完全理解关联如何在DataMapper下工作有关。
我正在运行的代码是:
Rose.setup_datamapper
Rose::User.first_or_create(:username => 'some-user', :password => 'REDACTED')
Rose::User.all.each do |user|
user.scrape_and_update
user.errors.each { |e| puts e } unless user.save
user.bandwidth_entries.each { |e| puts e }
end
我收到的错误是:
~ (0.000064) SELECT "id", "username", "password" FROM "rose_users" WHERE ("username" = 'some-user' AND "password" = 'REDACTED') ORDER BY "id" LIMIT 1
~ (0.000042) SELECT "id", "username", "password" FROM "rose_users" ORDER BY "id"
~ rose_bandwidth_entries.device_network_address may not be NULL (code: 19, sql state: , query: INSERT INTO "rose_bandwidth_entries" ("policy_mbytes_received", "policy_mbytes_sent", "actual_mbytes_received", "actual_mbytes_sent", "timestamp", "bandwidth_class", "user_id") VALUES (583.34, 39.58, 590.27, 44.26, '2011-09-20T13:39:31-04:00', 0.0, 1), uri: sqlite3:/Users/axiixc/Dropbox/Ruby/stats.sqlite?port=&adapter=sqlite3&fragment=&path=/Users/axiixc/Dropbox/Ruby/stats.sqlite&scheme=sqlite3&host=&user=&password=&query=)
模型类在这里:http://www.pastie.org/private/xer5grfaulmnxalne6g5va(简洁链接)
编辑好的,崩溃来自第26行的创建:
# /Library/Ruby/Gems/1.8/gems/dm-do-adapter-1.1.0/lib/dm-do-adapter/adapter.rb:114:in `execute_non_query': rose_bandwidth_entries.device_network_address may not be NULL (DataObjects::IntegrityError)
main_entry = BandwidthMainEntry.create(
:user => self,
:timestamp => Time.new,
:policy_mbytes_received => scrape_dict[:main][:policy_mbytes_received],
:policy_mbytes_sent => scrape_dict[:main][:policy_mbytes_sent],
:actual_mbytes_received => scrape_dict[:main][:actual_mbytes_received],
:actual_mbytes_sent => scrape_dict[:main][:actual_mbytes_sent],
:bandwidth_class => scrape_dict[:main][:bandwidth_class]
)
因此,它与BandwidthEntry/BandwidthDeviceEntry
的继承有关,因为该类甚至与设备没有关联。
也可以发布完整的堆栈跟踪:http://www.pastie.org/private/ospnkeeylul9mhf4fgxhdq
编辑好的,这里基本上是代码的其余部分http://www.pastie.org/private/pwmihpa6vu3h7lypx64ag
我永远不知道要发布多少,抱歉!
答案 0 :(得分:1)
好的,所以我擅长继承,应该阅读更多的文档。发生的事情是我错过了使用子类时所需的property :type, Discriminator
。因此,即使我的一个子类不需要与之关联的设备,另一个子类也是如此,这就是触发错误的原因。
我的工作模式如下:http://www.pastie.org/2564668
答案 1 :(得分:0)
猜测,值device_dict[:network_address]
未正确设置 - 该错误表示您正在插入NULL
设备地址,该地址来自您{的nil
值{1}}致电。当你去创建设备条目时,请尝试检查create
中的值。