Решение на Пета задача - 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 (преди около 8 години)
Михаил обнови решението на 29.11.2016 21:07 (преди около 8 години)
Супер странния начин да напишеш if/else
:(
Не можах да се събера в 50те реда на клас иначе :D А не исках да правя някакви по-странни неща за да разцепвам класа заради 1 ред.
Не е заради един ред - можеш да изкараш класовите методи в модул.
Мислех си за това, но ми се стори странно. Защото реално този нов модул би имал смисъл единствено за дадения клас, без него не може да се ползва. Това ме кара да си мисля, че трябва да си остане като част от класа. Или е нормална практика да разделиш по този начин различни смислови части от един компонент?
Да, обвързан е с дадения клас, но пък печелиш от това, че са на едно определено място всички функции за работа върху колекцията, отделени от тези, които работят с конкретен запис.
Тук нещо не е наред :)
Да, прав си. Просто тоя код го пренаписвах и променях N пъти за да пробвам различни решения и накрая съм се оплел. Достатъчно е просто да сетна @id и да го ползвам него по-надолу.
ПП. Ааа, видях и функционалния проблем. Ако съм трил може да сложа id, което вече го има...