← All posts tagged программирование

День 22. Писал миграцию для того, чтобы пересоздать привязки (источники информации вынесли в отдельную таблицу, которая позволяет связывать любые объекты/атрибуты). Этих привязок надо было создать тысяч 40. Оказывается, что rake db:migrate упаковывает все 40к запросов в одну транзакцию. Ждал час, а потом забил и пошел домой. Завтра узнаю как миграция применилась =)

День 21. Рефакторинг. Мы сделали фильтр, который применяется сразу же после выбора значения. Клиенту понадобилось использовать фильтр совместно с запросом по ключевым словам. Немного доработал скоупы, теперь проверка существования параметра убрана внутрь скоупа. Это позволяет вызвать сразу цепочку скоупов в контролере без всяких прерывающих проверок. Также пришлось удалять множество javascript-кода (который отвечал за переход). Жутко нудное задание!!!

День 20. Сделал модель для того, чтобы прикреплять любые файлы к любому объекту любой модели (через polymorphic). На это раз обошелся без jQuery File Upload. И сделал все через простенькую форму и redirect_to. Метод filename в Uploader переопределяет имя файла после загрузки (но model.id внутри него работает только на сохранение). Сделал так, чтобы создавалась директория с уникальным именем (и была возможность добавлять несколько файлов с одним и тем же именем). Чтобы не заморачиваться, написал примерно следующее для уникальной директории: Time.now.to_i.to_s(36).

День 19. Нас задолбал Unicorn и мы решили от него уйти... на Passenger. Поставили Passenger как standalone. Работает быстро и качественно отдает как потоки, так и статику. Одна лишь проблема — rvm. Как запустить Passenger автоматом и при этом в нужном окружении rvm?

День 17. Стали собирать проект в виртуальной машине. Проверили и обнаружили, что не работает выгрузка в XML и заливка файлов на сервер. Выгрузка перестала работать из-за маленькой ошибки в шаблоне (надо было заменить } на end), а с заливкой было все гораздо интереснее. Оказывается, что при указании multiple => true изменяется поведение file_field. Поле передается уже не как один файл, а массив файлов (хоть и с одним файлом внутри, из-за jQuery File Upload). Пока разобрался в чем дело, чуть не поседел.

День №14. Сделал txt версию для выдачи описей. Добавил несколько state_machine и их обработку (выбор состояний из списка select). Столкнулся с забавной проблемой хелпера select_date: чтобы присвоить ему css-класс нужно обязательно задать хеш параметров. То есть select_date(Time.now, {}, {:class => "date"}).

День №13 прошел в различных мелких доделках-переделках. Сгруппировал все поисковые формы на одну вьюшку и разграничил их табами. Если кто попытается повторить этот подвиг — не советую. Вам скорее всего придется переделывать все id у всех элементов формы (чтобы работали label и autocomplete). Немного повозился с версией для печати. Исправил менеджер фотографий, чтобы можно было выбирать несколько фоток за раз (параметр multiple).

День №12. В виду того, что стандартный render(:xml => @object) не умеет выдавать информацию потоком (то есть отсылать её по мере формирования), то пришлось делать свой костыль (см. codepad.org Сервак все равно подвисал на выдаче больших объемов и шаблон пришлось переделать: убрать вложенность find_each и делать привязку объектов как в базе — по id.

День №10. Форму ввода ФИО изменил с одного input на 3, но зато с autocomplete. Отдельно для Фамилии, Имени и Отчества создал модели, контроллеры и маршруты (routes). Они работают как справочники для autocomplete. При добавлении в базу нового ФИО пополняются и справочники. Можно было бы хранить только id, но слишком уж опасно такое делать. Пусть будет избыточность.

День №9. Сделал скачивание фоток в виде архива. Нужно было убрать пути и заменить имя файла. В виде потока удалось такое сделать только при помощи tar (ключ --transform) и send_data. Через rubyzip (и send_file) сделал только через временный файл (что не совсем хорошо). Смотрел ключики стандартного zip и смог только обрезать пути (-j). Кто знает как переименовать файлы во время добавления в архив?

День №8. Сегодня убедился в том, что записывать свои действия на работе очень даже необходимо. Перестал работать метод поиска, который я делал через pg_search_scope (см #1659885). Полез в Жуйк и почитал о том, что и когда делал. Оказалось, что идея делать его методом класса модели была неверной, а возврат self из этого метода приводил к тому, что всегда выводилось все содержимое таблицы. Переписал в виде scope, где в случае пустого запроса возвращал nil. Все заработало.

Боролся с jQuery-File-Upload, а точнее с Carrierwave, который не вносил имя файла в поле записи до тех пор, пока не вызвался метод save. Проверки уникальности этого поля не работали (пустое поле было уникально). Пришлось делать before_validate и принудительно писать имя файла в атрибут. Еще мне пришлось снять с атрибута модели Carrierwave (примонтировал с именем отличным от атрибута модели) при помощи опции :mount_on => :model_feild.

День №7. Прикручивал массовую заливку картинок на сервер. Использовал jQuery-File-Upload совместно с Carrierwave (обеспечивает получение файла и размещение его в нужном месте). Кстати, пример для использования во view не работает. Там устаревшая версия tmpl шаблона. Берите из исходников.

jQuery-File-Upload запрашивает список закаченных файлов из действия index в виде json. При помощи tmpl-шаблона строит список файлов. Тут же их можно удалить (по одному или списком) посредством действия destroy.

Демка: blueimp.github.com

День №6. Доделал все методы сортировки (ordered_). Реализовал не как sсope, а сразу методом модели (на выходе все равно массив нужен). Включил туда вызов всех необходимых joins и includes. Удалил все лишние переменные в контроллере (кроме одной, от которой и будут вызываться сортировки для разных табов).

День №5. Помимо создания парочки rake-задачек (генерация и переименование фейкового фотоархива), занимался переносом сортировок (вызовы order) из вьюшек в модель через контролер. Сортировки выносил в отдельные scope вида ordered_*. Чтобы в дальнейшем было удобно править...

День №3. Заставил работать ресурс people_properties аналогично ресурсу people_events, Походу обнаружилась забавная особенность: если before_validation проваливается (возвращает false), то до валидаций дело вообще не доходит и форма ввода ошибок тоже не отображает. Получается такая молчаливая ошибка.