Решение на Пета задача - 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 (преди около 8 години)
Иван обнови решението на 27.11.2016 13:32 (преди около 8 години)
Трябва ли да има метод #find_by_id или става въпрос само за атрибутите подадени на #attributes?
P.S Тук знам, че не са дефинирани правилно #find_by_ методите, но работя по въпроса
id
си е пълноправен атрибут - трябва да има.
Мерси за бързия отговор.
Имам още един въпрос относно #where
- грешката трябва да върне съобщение 'Unknown attribute <attribute_name>'
. В случай, че имаме повече от един непознат атрибут тук <attribute_name>
масив от атрибутите ли трябва да върне, или първият непознат, или всички непознати изредени със запетая ? xD
Първия непознат.
Иван обнови решението на 27.11.2016 15:53 (преди около 8 години)
Този 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 (преди около 8 години)
Иван обнови решението на 27.11.2016 19:58 (преди около 8 години)
Привет!
Взел съм ти точка заради използването на масив в HashStore
(втората точка от предния ми коментар). Ако ще пази масив - HashStore
губи смисъла си.
Виж си грешките от тестовете и внимавай какво пише в задачата - има доста пропуски по нещата от условието.