2011-09-20 2 views
1

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

EDIT Хорошо, что авария происходит от создания на линии 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

EDIT Хорошо, здесь в основном остальная часть кода http://www.pastie.org/private/pwmihpa6vu3h7lypx64ag

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

+0

Есть ли трассировки стека, когда появляется что? Можете ли вы сузить, какая линия запускает его? – Tim

+0

Вероятно, вы должны попытаться уменьшить свою проблему до того, что не удалось, и опубликовать весь соответствующий код в вопросе. –

+0

Обратите внимание, что источники трассировки в 'scrape_and_update', для которых у нас нет кода для - можете ли вы опубликовать этот метод? – Tim

ответ

1

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

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

0

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

+0

Но для этого класса не требуется device_network_address, поскольку он принадлежит пользователю, а не устройству. Так это что-то с моим наследством, которое испортило его? – axiixc

+0

Хорошо, я собираюсь поднять это до наследства, потому что я взял это и сделал все отличным классом, и теперь все работает хорошо. Так что теперь я думаю, что я пойду искать, как сделать наследование с правом DM. – axiixc