ФорумПрограммированиеБольше языковRuby → Что такое миграция в ROR и современных PHP фреймворках(клонах ROR)

Что такое миграция в ROR и современных PHP фреймворках(клонах ROR)

  • killich

    Сообщения: 270 Репутация: N Группа: Адекваты

    Spritz Авг. 16, 2009, 1:32 д.п., спустя 3 часа 26 минут 50 секунд

    Миграция (migration)

    Миграция - файл, обеспечивающий последовательные изменения в БД и ее формирование. В файле миграции в стандартном для ROR виде описана структура создаваемой таблицы в БД или изменения, которые необходимо произвести в уже существующих таблицах.

    Файлы миграции имеют уникальное имя, благодаря штампу системного времени в имени файла. Это позволяет следить за тем, какие миграции уже были выполнены, а какие не выполнены. В БД существует таблица migrations в которую при выполнении каждой миграции заносится штамп времени каждой миграции.

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

    Пример файла миграции:


    class CreateRoles < ActiveRecord::Migration
    def self.up
    create_table :roles do |t|
    t.string :name # Английское имя роли
    t.string :title # Название Роли
    t.text :description # Текстовое описание Роли
    t.text :settings # Настройки Роли

    t.timestamps
    end
    end

    def self.down
    drop_table :roles
    end
    end



    Представленная миграция создает в БД таблицу roles, поскольку в ее миграции указано create_table :roles.
    В таблице roles будут созданы поля соответствующих типов.

    string => VARCHAR(250)
    text => TEXT
    timestamps => это сокращенное обозначение 2х полей со значением времени (created_at, updated_at)

    Обратим внимание на указание параметров в виде :name, :description, :settings
    Символ двоеточия обозначает специальный тип данных в RUBY - СИМВОЛ (SYMBOL)

    Символ - это полнейший аналог строки, за некоторыми очень тонкими особенностями хранения символов в оперативной памяти. Исходя из того, что Символ это аналог Строки, то приведенная выше миграции могла выглядеть так:


    class CreateRoles < ActiveRecord::Migration
    def self.up
    create_table 'roles' do |t|
    t.string 'name' # Английское имя роли
    t.string 'title' # Название Роли
    t.text 'description' # Текстовое описание Роли
    t.text 'settings' # Настройки Роли

    t.timestamps
    end
    end

    def self.down
    drop_table 'roles'
    end
    end


    Однако я уверен, что будет очень трудно не согласится, что набрать один символ : проще, а главное БЫСТРЕЕ, чем набрать две кавычки и перевести каретку для набора строки внутри кавычек. Именно во многом из-за скорости РУБИ программисты так любят СИМВОЛЫ.
    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Авг. 15, 2009, 8:40 п.п., спустя 19 часов 7 минут 54 секунды

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

    а по теме. как например сделать контатенацию?

    :asds.:asdasd

    Сапожник без сапог
  • killich

    Сообщения: 270 Репутация: N Группа: Адекваты

    Spritz Авг. 16, 2009, 11:06 д.п., спустя 14 часов 25 минут 57 секунд

    :asds.:asdasd

    Символы так не используют. Обычно Символ это строка, передаваемая в функцию в качестве аргумента и состоящая только из одного слова.
    Просто случай, когда параметр является единственным словом очень и очень часто встречается. А милисекунды в повседневной работе складываются в секунды, минуты, часы, дни и недели.

    Очень часто используются в ассоциативных хешах для обращения к элементам:

                _policy_hash={
                 policy_hash.policy.to_sym=>{
                   :id=>policy_hash.id,
                   :value=>policy_hash.value,
                   :start_at=>policy_hash.start_at,
                   :finish_at=>policy_hash.finish_at,
                   :counter=>policy_hash.counter,
                   :max_count=>policy_hash.max_count
                 }
               }
    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Авг. 15, 2009, 8:48 п.п., спустя 9 часов 42 минуты 26 секунд

    ну я так и думал. забавная идея. в пхп одно слово тоже кстати можно не обрамлять кавычками ;)
    Сапожник без сапог
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz Авг. 15, 2009, 10:05 п.п., спустя 1 час 16 минут 53 секунды

    у этой штуки тока одна проблема надо описывать не только то что должно получится а еще то как вернуть предыдущее в случаи отката
  • killich

    Сообщения: 270 Репутация: N Группа: Адекваты

    Spritz Авг. 16, 2009, 11:06 д.п., спустя 13 часов 21 секунду

    class AddContactsAndBorderingFlagToBulletin < ActiveRecord::Migration
     def self.up
       add_column :bulletins, :contacts, :string
       add_column :bulletins, :bordered, :string
     end

     def self.down
       remove_column :bulletins, :contacts
       remove_column :bulletins, :bordered
     end
    end


    Мы о чем говорим?! Если о том, что я не показал как описать откат - то вот оно.
    Если наоборот тебя не устраивает наличие возможности отката - то для меня это странно.

    И вообще из моей практики откат крайне не желателен - и если и делается - то только в состоянии разработки - на боевом серваке так конечно не пошалишь.
    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz Авг. 16, 2009, 1:52 п.п., спустя 2 часа 45 минут 53 секунды

    killich, я о том что если делаешь откат то

    remove_column :bulletins, :contacts

    это самый примитивный случай

    на практике далеко не все так просто бывает, например ты не создавал колонок а манипулировал с данными, например чтото удалил, тогда тебе надо было делать файл с бэкапом из которого потом можно востановить

Пожалуйста, авторизуйтесь, чтобы написать комментарий!