- 1
course = course_id > 0 ? Course.find(course_id) : nil
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
course = course_id > 0 ? Course.find(course_id) : nil
стаж - это багаж. Senior
Если nil, то это правда говнокод.
Впрочем, мы можем сэкономить лишний запрос типа SELECT * from Courses where id=0.
Или рельсы умны и так не сделают?
Откуда он знает что не надо искать если id==0? Он умный и понимает что ID не может быть нулем?
Он типа сразу вернет nil?
Ну тогда правда говнокод
я лично не согласен. Просто defensive programming.
Ну, что бы читающему было проще проверить все граничные случаи не заглядывая в доку.
как я понимаю Вы с RoR не знакомы. данный метод с первых дней жизни. и часто на собеседованиях даже спрашивают отличия find & find_by это так сказать основы
Как страшно жыть
Чтож, не быть мне погромистом в вашей конторе.
Рельсовый ORM для RoR программиста примерно как знание Collections API в Java.
Я вполне верю что это азы платформы и их всегда спрашивают
Т.е. ты считаешь, что вопрос вроде
В чём отличие list.remove(0) от list.remove(Integer.valueOf(0))?
адекватен для собеседований?
У RoR вон на сайте написано что
find и find_by! кидаются RecordNotFound
а find_by вертает nil
Учитывая тот факт что 80% программирования на RoR это вызов методов ORM find и find_by я думаю что это адекватный вопрос
а 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
ну если 0 не валидный id то почему нет?
>>Мне кажется, вы всё врёти,
Я не умею RoR, я немного умею Ruby и всякие похожести вроде Django, так что верю топикстартеру
Потому что БД должна решать, валидный это id или нет, а не ОРМ.
Опять же, в доке ни слова про id:0, поэтому никакого особого говна в коде в топике не вижу.
RoR ORM расчитана на определенную структуру в базе, которую она создает
Она не может работать со случайной структурой, это же понятно
Или эта механика захардкожена только для id?
RoR же знает всё про твою таблицу.
Где тут defensive?
Тут даже exceptionа не будет, не говоря уже о порче памяти (руби же)
зы: а! ты наверное подумал что я назвал говнокодм функцию "find_by"?
Вовсе нет! Я имел ввиду код в топике) прочитай всю ветку
Очень много чего получил мусор возвращает nil в ruby, objc, swift, вот недавно узнал что и в lua тоже
Смотри: я могу в контракте функции написать "передавать сюда только положительное число" или "передавать только число от 1 до 12" или "передавать только инстанс класса Foo".
Как должна вести себя функция, в которую передали что-то не то и это статически не проверилось (ну в руби у нас вообще стат типизации нет, могли и строку передать)?
Она может:
* кидать Exception (это защитное программирование и есть кмк)
* делать мусор (как сделает си, например)
* возвращать nil.
Если в RoR принято "возвращать nil" на всякую чушь то это вполне логичный и ожидаемый контракт
А как бы ты сделал? Кинул бы exception?
Я думаю что возврат nil позволяет экономить место. Например, "foo".to_i в руби == 0
То-есть любой мусор при преобразовании в Integer = 0.
Даже nil.to_i будет 0.
Так что какой бы мусор ты ни передал туда -- он превратится в 0, и будет nil
1. Все записи в базе создаются через ОРМ
2. Если вы создали что-то не через ОРМ, то вы можете этого потом не найти, т.к. в ОРМ есть куча неявных допущений, завязанных на пункт 1.
Это же RoR, он сам таблицы создает
Тогда надо было сначала спросить "а есть ли запись с таким id в таблице?" и только потом звать find().
Что-то типа (пишу по памяти т.к. не знаю 1с)
Ну понятно что Выполнить() собссно _выполняет_ запроос