Решение на Пета задача - DataModel от Иван Станков
Резултати
- 4 точки от тестове
- 1 отнета точка
- 3 точки общо
- 17 успешни тест(а)
- 8 неуспешни тест(а)
Код
Лог от изпълнението
.F.F.F.F.FF./tmp/d20161202-15620-b6vnzz/spec.rb:144: warning: toplevel constant UnknownAttributeError referenced by DataModel::UnknownAttributeError
.FF..........
Failures:
1) DataModel has attributes and data_model getters
Failure/Error: expect(user_model.attributes).to include :first_name
expected [] to include :first_name
Diff:
@@ -1,2 +1,2 @@
-[:first_name]
+[]
# /tmp/d20161202-15620-b6vnzz/spec.rb:22:in `block (2 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 has #find_by_<attribute> methods
Failure/Error: expect(user_model.find_by_first_name('Ivan').map(&:id)).to eq [record.id]
NoMethodError:
undefined method `id' for {:id=>1, :first_name=>"Ivan", :last_name=>"Ivanov", :age=>nil}:Hash
# /tmp/d20161202-15620-b6vnzz/spec.rb:43:in `map'
# /tmp/d20161202-15620-b6vnzz/spec.rb:43:in `block (2 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 id generation does not reuse ids
Failure/Error: expect(georgi.id).to eq 2
expected: 2
got: 1
(compared using ==)
# /tmp/d20161202-15620-b6vnzz/spec.rb:71: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) DataModel equality comparison compares by id if both records are saved
Failure/Error: modified_ivan.first_name = 'Gosho'
NoMethodError:
undefined method `first_name=' for {:id=>1, :first_name=>"Ivan", :last_name=>nil, :age=>nil}:Hash
# /tmp/d20161202-15620-b6vnzz/spec.rb:103: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) DataModel.where finds records by attributes
Failure/Error: records = user_model.where(first_name: 'Ivan').map(&:last_name)
NoMethodError:
undefined method `last_name' for {:id=>1, :first_name=>"Ivan", :last_name=>"Ivanov", :age=>nil}:Hash
# /tmp/d20161202-15620-b6vnzz/spec.rb:125:in `map'
# /tmp/d20161202-15620-b6vnzz/spec.rb:125: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)>'
6) DataModel.where finds records by multiple attributes
Failure/Error: ).map(&:last_name)
NoMethodError:
undefined method `last_name' for {:id=>1, :first_name=>"Ivan", :last_name=>"Ivanov", :age=>nil}:Hash
# /tmp/d20161202-15620-b6vnzz/spec.rb:133:in `map'
# /tmp/d20161202-15620-b6vnzz/spec.rb:133: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)>'
7) DataModel#delete deletes only the record for which it is called
Failure/Error: ivan.delete
ArgumentError:
wrong number of arguments (given 0, expected 1)
# /tmp/d20161202-15620-b6vnzz/spec.rb:156:in `delete'
# /tmp/d20161202-15620-b6vnzz/spec.rb:156: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)>'
8) DataModel#delete raises an error if the record is not saved
Failure/Error: DataModel::DeleteUnsavedRecordError
NameError:
uninitialized constant DataModel::DeleteUnsavedRecordError
# /tmp/d20161202-15620-b6vnzz/spec.rb:164: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.0251 seconds
25 examples, 8 failures
Failed examples:
rspec /tmp/d20161202-15620-b6vnzz/spec.rb:21 # DataModel has attributes and data_model getters
rspec /tmp/d20161202-15620-b6vnzz/spec.rb:39 # DataModel has #find_by_<attribute> methods
rspec /tmp/d20161202-15620-b6vnzz/spec.rb:62 # DataModel id generation does not reuse ids
rspec /tmp/d20161202-15620-b6vnzz/spec.rb:92 # DataModel equality comparison compares by id if both records are saved
rspec /tmp/d20161202-15620-b6vnzz/spec.rb:124 # DataModel.where finds records by attributes
rspec /tmp/d20161202-15620-b6vnzz/spec.rb:129 # DataModel.where finds records by multiple attributes
rspec /tmp/d20161202-15620-b6vnzz/spec.rb:151 # DataModel#delete deletes only the record for which it is called
rspec /tmp/d20161202-15620-b6vnzz/spec.rb:162 # DataModel#delete raises an error if the record is not saved
История (6 версии и 16 коментара)
Иван обнови решението на 27.11.2016 11:32 (преди почти 9 години)
Иван обнови решението на 27.11.2016 13:32 (преди почти 9 години)
Трябва ли да има метод #find_by_id или става въпрос само за атрибутите подадени на #attributes?
P.S Тук знам, че не са дефинирани правилно #find_by_ методите, но работя по въпроса
id си е пълноправен атрибут - трябва да има.
Мерси за бързия отговор.
Имам още един въпрос относно #where - грешката трябва да върне съобщение 'Unknown attribute <attribute_name>'. В случай, че имаме повече от един непознат атрибут тук <attribute_name> масив от атрибутите ли трябва да върне, или първият непознат, или всички непознати изредени със запетая ? xD
Първия непознат.
Иван обнови решението на 27.11.2016 15:53 (преди почти 9 години)
Този hook е излишен. Използвай директно инстанционните променилви, те са nil по подразбиране.
И тук имаш 2 гетъра и сетъра - keys и attributes. Безсмислено е.
Защо имаш 2 getter-а за едно и също нещо? data_store и storage
Обвързал си брояча с модела, вместо с data store-а. Сещаш ли се за случай, в който това ще генерира грешни id-та?
Тази дума не се пише така.
Това на практика е select. Разкарай го този C подход
Какво можеш да използваш тук?
Хайде пак итеративни истории
О не. Моля те, прочети как работи map и го използвай по предназначение.
Благодаря за коментарите! Като цяло за някои от нещата не се бях замислил, стараех се да докарам функционалността и просто така ми тече мисълта. Сега ще започна да рефрактурирам!
Тук не ми харесват няколко неща:
- Вместо
mapиselectправиш цикли. Не пишеш на C или PHP. - Това наследяване на
DataStoreе супер измъчено и се опитваш да заобикаляш условието на задачата. Направи напълно отделни, без да наследяваш. Вътрешното представяне наHashStoreтрябва да е хеш, не да го генерираш когато го искаме. - Този ред
attr_accessor :storage, :last_id, :keysне прави нищо специално. Създава гетър и сетър за инстанционни променливи. Можеш да достъпваш тези променливи и директно, няма нужда постоянно да пишешself.storage = <whatever>
Иван обнови решението на 27.11.2016 19:28 (преди почти 9 години)
Иван обнови решението на 27.11.2016 19:58 (преди почти 9 години)
Привет!
Взел съм ти точка заради използването на масив в HashStore (втората точка от предния ми коментар). Ако ще пази масив - HashStore губи смисъла си.
Виж си грешките от тестовете и внимавай какво пише в задачата - има доста пропуски по нещата от условието.
