- 1
course = course_id > 0 ? Course.find(course_id) : nil
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
course = course_id > 0 ? Course.find(course_id) : nil
стаж - это багаж. Senior
Steve_Brown 02.07.2018 14:23 # 0
AlexKlim 03.07.2018 18:39 # 0
roskomgovno 02.07.2018 18:21 # 0
Если nil, то это правда говнокод.
Впрочем, мы можем сэкономить лишний запрос типа SELECT * from Courses where id=0.
Или рельсы умны и так не сделают?
AlexKlim 03.07.2018 18:39 # 0
AlexKlim 03.07.2018 18:39 # 0
roskomgovno 03.07.2018 18:48 # 0
AlexKlim 03.07.2018 18:50 # 0
roskomgovno 03.07.2018 18:52 # 0
Откуда он знает что не надо искать если id==0? Он умный и понимает что ID не может быть нулем?
Он типа сразу вернет nil?
Ну тогда правда говнокод
roman-kashitsyn 03.07.2018 19:17 # 0
я лично не согласен. Просто defensive programming.
AlexKlim 03.07.2018 19:19 # 0
roman-kashitsyn 03.07.2018 19:24 # +1
roskomgovno 03.07.2018 19:29 # 0
Ну, что бы читающему было проще проверить все граничные случаи не заглядывая в доку.
AlexKlim 03.07.2018 19:53 # 0
как я понимаю Вы с RoR не знакомы. данный метод с первых дней жизни. и часто на собеседованиях даже спрашивают отличия find & find_by это так сказать основы
roman-kashitsyn 03.07.2018 19:57 # 0
Как страшно жыть
Чтож, не быть мне погромистом в вашей конторе.
roskomgovno 03.07.2018 20:01 # 0
Рельсовый ORM для RoR программиста примерно как знание Collections API в Java.
Я вполне верю что это азы платформы и их всегда спрашивают
roman-kashitsyn 03.07.2018 23:43 # 0
Т.е. ты считаешь, что вопрос вроде
В чём отличие list.remove(0) от list.remove(Integer.valueOf(0))?
адекватен для собеседований?
roskomgovno 04.07.2018 00:20 # 0
У RoR вон на сайте написано что
find и find_by! кидаются RecordNotFound
а find_by вертает nil
Учитывая тот факт что 80% программирования на RoR это вызов методов ORM find и find_by я думаю что это адекватный вопрос
roman-kashitsyn 04.07.2018 00:58 # +1
а find_by вертает nil
Ещё раз: у меня бомбит не от nil, а от того, что "лишнего запроса не будет".
Пошёл, посмотрел доку на оф. сайте http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find_by
Ничего про особую обработку id:0 не сказано.
Мне кажется, вы всё врёти, а сеньёр героически сыкономил запрос.
https://github.com/rails/rails/issues/5982 lol
roskomgovno 04.07.2018 01:41 # 0
ну если 0 не валидный id то почему нет?
>>Мне кажется, вы всё врёти,
Я не умею RoR, я немного умею Ruby и всякие похожести вроде Django, так что верю топикстартеру
roman-kashitsyn 04.07.2018 11:45 # +1
Потому что БД должна решать, валидный это id или нет, а не ОРМ.
Опять же, в доке ни слова про id:0, поэтому никакого особого говна в коде в топике не вижу.
roskomgovno 04.07.2018 18:17 # 0
RoR ORM расчитана на определенную структуру в базе, которую она создает
Она не может работать со случайной структурой, это же понятно
bormand 04.07.2018 19:08 # 0
Или эта механика захардкожена только для id?
roskomgovno 04.07.2018 21:25 # 0
RoR же знает всё про твою таблицу.
MAKAKA 31.03.2021 00:41 # 0
roskomgovno 03.07.2018 19:24 # 0
Где тут defensive?
Тут даже exceptionа не будет, не говоря уже о порче памяти (руби же)
зы: а! ты наверное подумал что я назвал говнокодм функцию "find_by"?
Вовсе нет! Я имел ввиду код в топике) прочитай всю ветку
roman-kashitsyn 03.07.2018 19:54 # +1
roskomgovno 03.07.2018 19:58 # 0
Очень много чего получил мусор возвращает nil в ruby, objc, swift, вот недавно узнал что и в lua тоже
roman-kashitsyn 03.07.2018 20:01 # +1
roskomgovno 03.07.2018 20:20 # 0
Смотри: я могу в контракте функции написать "передавать сюда только положительное число" или "передавать только число от 1 до 12" или "передавать только инстанс класса Foo".
Как должна вести себя функция, в которую передали что-то не то и это статически не проверилось (ну в руби у нас вообще стат типизации нет, могли и строку передать)?
Она может:
* кидать Exception (это защитное программирование и есть кмк)
* делать мусор (как сделает си, например)
* возвращать nil.
Если в RoR принято "возвращать nil" на всякую чушь то это вполне логичный и ожидаемый контракт
А как бы ты сделал? Кинул бы exception?
Я думаю что возврат nil позволяет экономить место. Например, "foo".to_i в руби == 0
То-есть любой мусор при преобразовании в Integer = 0.
Даже nil.to_i будет 0.
Так что какой бы мусор ты ни передал туда -- он превратится в 0, и будет nil
roman-kashitsyn 03.07.2018 23:47 # +1
1. Все записи в базе создаются через ОРМ
2. Если вы создали что-то не через ОРМ, то вы можете этого потом не найти, т.к. в ОРМ есть куча неявных допущений, завязанных на пункт 1.
roskomgovno 04.07.2018 00:17 # 0
Это же RoR, он сам таблицы создает
bormand 04.07.2018 19:12 # 0
Тогда надо было сначала спросить "а есть ли запись с таким id в таблице?" и только потом звать find().
roskomgovno 04.07.2018 22:01 # 0
Что-то типа (пишу по памяти т.к. не знаю 1с)
Ну понятно что Выполнить() собссно _выполняет_ запроос