Связи / валидация DataMapper, вызывающие сбой сохранения - PullRequest
1 голос
/ 20 сентября 2011

Итак, у меня возникли проблемы с DataMapper и ассоциациями объектов. (Код указан внизу). Я получаю ошибки при сохранении в той степени, что некоторые идентификаторы не установлены, что, я думаю, связано с тем, как я настраиваю свои ассоциации / не полностью понимаю, как работают ассоциации в 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

Я никогда не могу сказать, сколько писать, извините!

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Хорошо, так что я занялся наследованием и должен был прочитать больше документации. Происходило то, что я пропустил property :type, Discriminator, необходимый при использовании подклассов. Поэтому, хотя моему одному подклассу не требовалось устройство, связанное с ним, другому требовалось, так что именно это и вызывало ошибку.

Моя рабочая модель выглядит так: http://www.pastie.org/2564668

0 голосов
/ 20 сентября 2011

По-видимому, значение device_dict[:network_address] не устанавливается должным образом - эта ошибка указывает на то, что вы вставляете адрес устройства NULL, который получается из значения nil в вашем вызове create.Попробуйте проверить значения в device_dict при создании записей устройства.

...