Записи с меткой ‘rails’
Проверка данных моделей ActiveRecord и функции обратного вызова. Первая часть.
Перевод Active Record Validations and Callbacks
Это руководство описывает цикл жизни объектов Active Record. Вы узнаете, как проверить состояние объектов прежде, чем они попадут в базу данных, и как выполнить собственный код в определенных моментах цикла жизни объекта.
Прочтя это руководство, Вы сможете:
- цикл жизни объектов Active Record
- Использовать встроенные помощники для проверки состояния данных модели
- Создавать свои собственные помощники для проверки состояния данных модели
- Работать с сообщениями об ошибках, которые генерируются в результате этих проверок
- Создавать функции обратного вызова, вызываемые на разные события происходящие в течении жизни объекта
- Создавать специальные классы, которые будут энкапсулировать общее поведение для функций обратного вызова
Создавать классы-наблюдатели, которые будут отвечать за вызов соответствующих методов в ответ на события происходящие в течении жизни объекта
Настройка Rails приложений
Перевод: Configuring Rails Applications
Это руководство описывает настройку Rails приложений, и инициализацию разных возможностей, доступных для Rails приложений . Прочтя это руководство, Вы сможете:
- Корректировать поведение своих Rails приложений
Добавлять дополнительный код, который будет выполнен на этапе загрузки приложения
Интерфейс запросов ActiveRecord
Перевод: Active Record Query Interface
Это руководство описывает различные способы получать данные от базы данных, используя ActiveRecord. Прочтя это руководство, Вы сможете:
- Искать записи в базе данных с помощью множества методов и всевозможных условий
- Определять сортировку, требуемые атрибуты, группировку и другие свойства для поиска записей
- Использовать отложенную загрузку, чтобы сократить количество запросов к базе данных, необходимых для поиска
- Использовать динамические методы поиска
- Создавать именованные области видимости (named_scope), для добавления новых средств поиска Ваших моделей
- Проверять существование определенных записей
Выполнять различные расчеты в моделях ActiveRecord
Краткое руководство по named_scope
named_scope :active, :conditions => {:active => true}
named_scope :inactive, :conditions => {:active => false}
named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago]
} }
end
Кэширование и отдача картинки приложением
Как-то потребовалось, чтоб приложение отдавало изображения по адресам, типа таких: /images/12.png, /images/32.gif и т. д. Где цифра это id изображения в базе. Мой nginx кэширует файлы в директориях images, javascripts, stylesheets
expires 10y;
}
В связи с чем запрос не передается приложению, не зависимо от того, есть ли какой файл или его нет. Для решения проблемы добавил в конфиг исключение для случая, когда имя изображения – это число.
proxy_pass http://mongrel;
break;
}
location ~ ^/(images|javascripts|stylesheets)/ {
expires 10y;
}
Я настраивал nginx и mongrel_cluster для rails проекта так
Это основной конфиг nginx:
worker_processes 6;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/sites-enabled/*;
}
Построение дерева из плоского массива
Когда нам надо работать со всем деревом сразу, иногда, бывает нужно построить дерево из плоского массива. К примеру у нас есть категории товара
has_many :products
acts_as_nested_set
end
И нам нужно в панели управления показывать дерево категорий. Мы можем взять категории первого уровня, показать их на сайте и по мере выбора категорий погружать ajax запросом их дочек. Получаем слишком много запросов и ненужные задержки при открытии категории.
Проще взять список категорий целиком и построить из него дерево. Потом его использовать для отображения на сайте. Для построения дерева потребуется закешированое свойство cached_level из предыдущего примера.
Кэширование свойства level в awesome_nested_set
Плагин awesome_nested_set в целом достаточно удобный для работы с деревьями, но раздражает отсутствие поля level. Для вычисления level приходится каждый раз обращаться к базе.
Это бывает не удобно, когда нужно вытащить дерево целиком и построить его иерархию. Чтобы кэшировать level в базе данных можно в модель добавить такой код:
acts_as_nested_set
after_move :caching_level
private
def caching_level
self.cached_level = level
save!
end
end
Это добавит один запрос при перемещении узла, но удалит кучу запросов при формировании дерева.
Bash скрипт для создания rails приложений
Bash скрипт который позволяет создать rails приложение, добавить его в SVN и удалить из SVN с пометкой игнорировать, папки не предназначенные для хранения в SVN (логи, временные файлы…)
Исчезающие flash сообщения
Для передачи сообщений от запроса к запросу используют flash сообщения. Чтобы организовать работу по отображению flash сообщений можно написать помощник, который будет скрывать сообщение по прошествии какого-то времени, чтобы оно не мешало.

(7 голосов, средний: 4.14 из 5)