Решение на Пета задача - DataModel от Михаил Здравков
Към профила на Михаил Здравков
Резултати
- 5 точки от тестове
- 0 бонус точки
- 5 точки общо
- 20 успешни тест(а)
- 5 неуспешни тест(а)
Код
Лог от изпълнението
.......F....F.F.......FF.
Failures:
1) DataModel equality comparison compares by id if both records are saved
Failure/Error: modified_ivan = user_model.where(id: ivan.id).first
NameError:
uninitialized constant DataModelClassMethods::UnknownAttributeError
# /tmp/d20161202-15620-oovmxf/solution.rb:81:in `where'
# /tmp/d20161202-15620-oovmxf/spec.rb:102:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'
2) DataModel.where raises an error if the query is by an unknown key
Failure/Error: expect { user_model.where(middle_name: 'Ivanov') }.to raise_error(
expected DataModel::UnknownAttributeError with "Unknown attribute middle_name", got #<NameError: uninitialized constant DataModelClassMethods::UnknownAttributeError> with backtrace:
# /tmp/d20161202-15620-oovmxf/solution.rb:81:in `where'
# /tmp/d20161202-15620-oovmxf/spec.rb:143:in `block (4 levels) in <top (required)>'
# /tmp/d20161202-15620-oovmxf/spec.rb:143:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'
# /tmp/d20161202-15620-oovmxf/spec.rb:143:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'
3) DataModel#delete raises an error if the record is not saved
Failure/Error: expect { user_model.new(first_name: 'Ivan').delete }.to raise_error(
expected DataModel::DeleteUnsavedRecordError, got #<UncaughtThrowError: uncaught throw #<DataModel::DeleteUnsavedRecordError: DataModel::DeleteUnsavedRecordError>> with backtrace:
# /tmp/d20161202-15620-oovmxf/solution.rb:116:in `throw'
# /tmp/d20161202-15620-oovmxf/solution.rb:116:in `delete'
# /tmp/d20161202-15620-oovmxf/spec.rb:163:in `block (4 levels) in <top (required)>'
# /tmp/d20161202-15620-oovmxf/spec.rb:163:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'
# /tmp/d20161202-15620-oovmxf/spec.rb:163:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'
4) ArrayStore behaves like a data store #update updates the attributes of a record with a given ID
Failure/Error: store.update(2, {id: 2, name: 'Georgi'})
NoMethodError:
undefined method `merge!' for nil:NilClass
Shared Example Group: "a data store" called from /tmp/d20161202-15620-oovmxf/spec.rb:239
# /tmp/d20161202-15620-oovmxf/solution.rb:24:in `update'
# /tmp/d20161202-15620-oovmxf/spec.rb:199:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'
5) ArrayStore behaves like a data store #update only updates records with the correct IDs
Failure/Error: store.update(2, {id: 2, name: 'Sasho'})
NoMethodError:
undefined method `merge!' for nil:NilClass
Shared Example Group: "a data store" called from /tmp/d20161202-15620-oovmxf/spec.rb:239
# /tmp/d20161202-15620-oovmxf/solution.rb:24:in `update'
# /tmp/d20161202-15620-oovmxf/spec.rb:210:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'
Finished in 0.03015 seconds
25 examples, 5 failures
Failed examples:
rspec /tmp/d20161202-15620-oovmxf/spec.rb:92 # DataModel equality comparison compares by id if both records are saved
rspec /tmp/d20161202-15620-oovmxf/spec.rb:142 # DataModel.where raises an error if the query is by an unknown key
rspec /tmp/d20161202-15620-oovmxf/spec.rb:162 # DataModel#delete raises an error if the record is not saved
rspec /tmp/d20161202-15620-oovmxf/spec.rb:196 # ArrayStore behaves like a data store #update updates the attributes of a record with a given ID
rspec /tmp/d20161202-15620-oovmxf/spec.rb:204 # ArrayStore behaves like a data store #update only updates records with the correct IDs
История (5 версии и 7 коментара)
Михаил обнови решението на 29.11.2016 20:42 (преди почти 9 години)
Михаил обнови решението на 29.11.2016 21:07 (преди почти 9 години)
Супер странния начин да напишеш if/else :(
Не можах да се събера в 50те реда на клас иначе :D А не исках да правя някакви по-странни неща за да разцепвам класа заради 1 ред.
Не е заради един ред - можеш да изкараш класовите методи в модул.
Мислех си за това, но ми се стори странно. Защото реално този нов модул би имал смисъл единствено за дадения клас, без него не може да се ползва. Това ме кара да си мисля, че трябва да си остане като част от класа. Или е нормална практика да разделиш по този начин различни смислови части от един компонент?
Да, обвързан е с дадения клас, но пък печелиш от това, че са на едно определено място всички функции за работа върху колекцията, отделени от тези, които работят с конкретен запис.
Тук нещо не е наред :)
Да, прав си. Просто тоя код го пренаписвах и променях N пъти за да пробвам различни решения и накрая съм се оплел. Достатъчно е просто да сетна @id и да го ползвам него по-надолу.
ПП. Ааа, видях и функционалния проблем. Ако съм трил може да сложа id, което вече го има...
