← All posts tagged Rails

Давно не писал, но чо уж. @dream-x дал идиотичнейшнее задание, которое сам не представляет как выполнить. В итоге я сделал небольшой кусочек шедевра.

Стейт-машина + rails_admin. Задача: каждый заказ проходит несколько стадий при полоижительных условиях или переходит к иным при отрицательных условиях. В админке (упрощающей жизнь, как некоторые считают). И для облечения жизни в админку можно писать значения полей (кортежей) только вручную. Ня? Соблюдаем целстность процесса и ни отходим ни на шаг. С ручным вводом состояний заказа.

Решено было добавить выпадающий список с эвентами стейт-машины и завести для него промежуточное поле.

(Эвенты позволяют отмечать заказ как оплаченный в нужные нам моменты: когда счёт уже был выставлен, а не когда заказ только создан и счёта, разумеется, ещё нет.)

Эвенты берутся из списка доступных для текущего состояния. Например, для состояния "ожидаем оплаты" есть два события: оплачено и отмена. Если в списке выбрать "оплачено", то мы переходим к сохранению экземпляра модели. И вот на этом этапе самое кливое:

1) если доп. поле содержит событие
2) сохраняем событие, зануляем жоп. поле
3) делаем self.send("#{событие}!")

Две строчки на интеграцию, круто, а!?)

Пусть нужно хранить список городов и стран, в которых они находятся.

В Rails это обычно делается как:
ModelTown: id, name, country_id + CountryModel: id, name.

Но в книге по БД рекомендуется выполнять это как:
Town: id, name, country_name.

Я согласен с доводами, приведёнными в книге. Кроме того, это быстрее. А верно ли будет использовать такую схему в Rails?

Забрался в прошлый проект. Добавляю функционал. Смотрю вьюху:
<% Keyword.from("`keywords`, `words`").where("`site_id` = '#{@site.id}' AND `words`.`id` = `keywords`.`word_id`").order("`words`.`name`").each do |keyword| %>
Кто, блядь, это писал!? Ёпт...

Ня! Следующая неделя будет неделю Rails Way, ибо нехуй говнокод плодить. Начну со злосчастного RSpec и весь код покрою тестами чтобы в следующий раз не делать вид что тесты — это сложно, а потом потом и вообще.