четверг, 25 сентября 2008 г.

Детально о миграциях. Создание таблиц. Добавление полей.

Как уже было сказано в статье Миграции. Что такое миграции? после создания миграции, в ней присутствует всего два метода - self.up i self.down. Первый вызывается при выполнении текущей миграции в рамках проведения всех миграций (rake db:migrate), второй срабатывает когда делается откат текущей миграции.

Соответственно метод self.down нейтрализирует все то что было сделано методом self.up. Если мы в self.up добавляем новое поле то в self.down мы его должны удалить, если создаем таблицу - то при откате должны ее удалить, если переимнновываем или меняем тип поля, то при откате все должно вернутся на круги своя.

Тепер детально рассмотрим какие действия мы можем делать с БД в текущих методах. Сначала начнем с более простых действий, а закончим более сложными.

Условимся, что работать ми будем с таблицей пользователей, соответственно модель - User. Я буду попарно давать действия и противодействия (для отката).

Добавление нового поля

def self.up
add_column :users, :name, :string
end

Сначала указывается таблица, далее указывается имя поля, потом указывается его тип. Весь список используемых типов можно посмотреть в моей статье: Типы данных в миграциях для разных СУБД

Удаление нового поля

def self.down
remove_column :users, :name
end

Сначала указываем таблицу, потом имя поля которое нужно удалить

Переименование колонок

def self.up
rename_column :users, :name, :user_name
end

Указывается сначала таблицу, потом старое имя поля, потом новое имя поля

Обратное переименование колонок

def self.down
rename_column :users, :user_name, :name
end

для отката достаточно вызвать то же метод, только поменять поля местами

Изменение типа поля

def self.up
change_column :users, :age, :integer
end

Указывается сначала имя таблицы, потом имя поля, потом его новый тип

Обратное изменение имя поля

def self.down
change_column :users, :age, :string
end

Для обратного изменения достаточно указать старый тип. Но иногда бывает так, что нада заблокировать возможность отката, например если у нас логика приложения будет жестко привязана к тому что тип поля целый. Тогда в Рельсах используется специальная конструкция которая запрещает откат даной миграции:

def self.down
raise ActiveRcord::IrreversibleMigration
end

Следующим большим разделом будут - Таблицы

Создание таблицы

def self.up
create_table :users, * do |table|
table.column :name, :string, **
table.column :age, :integer
end
end

* - здесь могут указыватся дополнительные опции для создания таблицы:

:force=>true/false - удалать таблицу если уже существует таблица с таким именем
:temporary=>true/false - промежуточная таблица(существует до дисконекта с базой)
:option=>"same opions", например: "auto_increment = 25" - дополнительные SQL опции
:primary_key=>:field_name - если нада задать имя поля отличное от дефолтного ID
:id=>false - если нужно создать таблицу без первичного ключа

** - здесь и в конце каждого объявления поля могут быть дополнительные опции:

:null => true/false - признак того, может ли поле быть null
:limit => field size - максимальный размер поля
:default => default value - значение поля по-умолчанию
В table.column указывается имя поля, тип поля

Удаление таблицы

def self.down
drop_table :users
end
Тут я думаю все понятно :)

Создание/удаление индексов

add_index :users, :name - Для создания индекса указываем таблицу и имя поля

remove_index :user, :name - Для удаление индекса указываем таблицу и имя поля

Типы даных в миграциях для разных СУБД

Кликните на картинку для более детального просмотра

пятница, 19 сентября 2008 г.

FireFox 3.1 доступна Бета-версия

Как и анонсировалось, ФФ выпустил бета-версию нового усовершенствованного браузера под порядковым номером 3.1. Теперь все поклонники ФФ смогут скачать броузер для тестирования - по этой ссылке. Правда пока интерфейс только на английском, но для истинных поклонников это думаю не помеха.

Разработчики Mozilla произвели серию новых оптимизаций JavaScript движка Firefox, разрабатываемого под кодовым именем SpiderMonkey. Внесенные изменения позволили увеличить скорость выполнения некоторых скрптов в 20-40 раз. Новые "tracing" оптимизации, с реализацией нового JIT-компилятора (Just-In-Time), интегрированы в дерево исходных текстов firefox.

Суть "tracing" оптимизации в сохранении плана выполнения скрипта и в последующем использование бинарного кода при выполнении подобных блоков. При этом происходит преобразование циклов и сложных методов в вид линейного потока инструкций.

Основные нововведения:
  • Drag and Drop между IE и Firefox
  • Поддержка технологии web worker threads
  • Новый селектор для создания Aero-style “glass” в XUL Initial Glass support
  • Поддержка CSS 2.1 свойств: ::before, ::after и white-space:pre-line
  • Поддержка CSS 3 свойств: -moz-border-image, word-wrap: break-word, text-shadow, box-shadow и column-rule
  • Улучшенная производительность(обещают в 22 раза)
Благодаря включенной в «Firefox 3.1» поддержке открытого видеокодека «Ogg Theora» для просмотра контента в соответствующем формате пользователям больше не придется загружать специальный плагин. Другим важным изменением в новой версии браузера является поддержка тега video для интеграции видеоматериалов в веб-страницы.

Добавлю еще один момент с которым столкнулся после установки - также как и в ФФ3, когда я открываю страничку www.gmail.com, то страничка с почтой уменьшена в несколко раз и читать что-либо там невозможно... В Google Chrom все выглядит нормально... Обидно что есть такой недочет, просто использую восновном только ФФ в повседневности.

вторник, 16 сентября 2008 г.

Сортировка в find. Зачем нужны conditions

Для того чтобы найти что-то в БД используется метод Find(из фреймворка ActiveRecord), который имеет следующий вид:

result=
User.find(:all/:first/:last,
:conditions=>"some conditions",
:order=>"some order",
:limit=>"count records in result")


:all/:first/:last - альтернативы поиска, разделены косой чертой чисто схематически, на самом деле для любого запроса испольовать разрешено только один из параметров. Соответственно они указывают что вернуть в запросе - все записи/первую/последнюю запись.

:conditions=>"some conditions" - это условия выборки, например:
:conditions=>"id = 1 and name='some name'"
или
:conditions=>["name= ? and lastname = ? ", name, lastname] - параметры передаются как Хеш.

:order=>"some order" - условие сортировки, например:
:order=>"name, age DESC" - сортируем сначала по имени(по алфавиту, параметр ASC можно опускать, так как это сортировка по-умолчанию), потом сортируем по возрасту, по
убыванию(указать надо явно).

:limit=>"count records in result" - количество возвращаемых записей, например:
:limit=>"10"

Дополнительные параметры добавлю в статью позже, если она будет пользоватся интиресом у читателей (:joins,:select,:offset,:from,:group,:lock,:readonly)

пятница, 12 сентября 2008 г.

Маленький глюк Google Chrome

Стараюсь пользоватся иногда броузером Google Chrome, дабы собственноручно его протестировать. Пока нашел такой глюк - когда смотришь на youtube видео и периодически его пролистываешь, то он таки частенько любит зависать(правда только текущая вкладка,как и обещали разработчики :) ).

Еще один глюк, точнее неудобство: Когда в Мозиле кликнуть кнопочку "Назад" зажав при этом Ctrl, то предыдущая страница открывается в новой вкладке, что очень удобно и я часто этим пользуюсь. В Google Chrome такой возможности не предвидели...

...да и без любимых плагинов Файрфоксных как-то одиноко....

понедельник, 8 сентября 2008 г.

Миграции. Что такое миграция?

Как уже было описано в предыдущих статьях, рельсы работают с Базой данных через ActiveRecord(обьектная прослойка между Бд і web-приложением), настройка производится в одном единственном файле конфигурации. Возникает логичный вопрос - мы создали базу, настроили конфиги, так как же нам создать структуру БД??

Ответ - миграции. Что же такое миграция и зачем они вообще нужны?

Миграция - это файл который содержит описание создания в БД таблиц и полей. Чтобы создать миграцию воспользуйтесь или консолью или меню вашей IDE. В консоли надо набрать - ruby script/generate migration add_a_new_table. "Add a new table" - название миграции, которое должно описывать действие с БД.

Содержимое файла(Как пример приведем код создания таблицы юзеров):


class CreateUsers < ActiveRecord
def self.up
      create_table :users do |table|
         table.column :username, :string, :null => false, :limit => 60

         table.column :password, :string, :null => false
     end
end
def self.down
     drop_table :users
end
end

Детальнее типы данных рассмотрим в следующих статьях.

Таким образом отдельные миграции содержат отдельную логику создания новых структур. Код после
def self.down нужен для того чтобы миграцию можно было "откатить назад". Все миграции складываются в отдельную папку и их имя файла начинается с цыфры которая показывает ее место в списке. Миграции исполняются строго по очереди. Из за того что предусмотрен откат - мы можем безболезненно вернутся в любое последнее стабильное состояние БД до изминения.

Благодаря тому что миграции хранятся в отдельных, легкочитаемых файлах - достаточно только загрузить их из SVN и проммигрировать - и каждый разработчик получит точную копию основной БД на свою машину. Нет необходимости делать SQL дампы, а потом руками переносить все в нашу локальную базу. Так же легко и закомитить миграции в репозиторий где проведя миграции (на сервере проводяться в автоматичном режиме) мы внесем изминения в нашу рабочую БД.

четверг, 4 сентября 2008 г.

Google Chrome - обзор нового браузера

Гугль анонсировал выход в свет нового браузера, в котором впервые реализован механизм многопоточности, вернее многопроцессорности - на каждую вкладку свой процес, тоесть если где-то у вас зависнет ЯваСкрипт - то зависнет только 1 владка, а не весь браузер.

Я уже поставил себе это чудо - впечатление вцелом позитифф:) работает шустренько, не глючит, своеобразный интерфейс. Всем рекомендую попробовать. Детальную информацию выложу после тестирования браузера для своих нужд.

Детальную информацию можно посмотреть тут http://unno.ru/chrome/

Закачать браузер можно здесь: закачка