0

Я прочитал RoR руководство, и я не понимаю, следующая строка:Рельсы. ActiveRecord :: Migration. Реверсивный

Если вы хотите для миграции, чтобы сделать что-то, что Active Record не знает, как реверс, вы можете использовать обратимый

Что значит «не знает, как отменить»? Как отличить, что Active Record может отменить, а что нет?

ответ

1

Это просто, есть два вида операций в AR миграции:

1) Rails автоматически знает, как откатить (вернуться) эти операции в миграции, например:

def change 
    add_column :users, :age, :integer 
end 

миграция означает, что добавить столбец возраст, средство отката удалить столбец возраст. Или create_table, обратная операция drop_table. Эти операции можно поместить в изменение метод миграции и рельсы знает, что делать при откате/обратном переносе.

2) Rails должен помочь, как обрабатывать миграцию и Откат процесс, как правило, это операции, которые каким-то образом модифицирует данные.

def self.up 
    add_column :users, :name, :string 
    add_column :users, :surname, :string 
    say_with_time 'Split username into name and surname' do 
     Users.select(:username).all.each do |user| 
      user.name = user.username.split(/ /)[0] 
      user.surname = user.username.split(/ /)[1] 
      user.save! 
     end 
    end 
    remove_column :users, :username 
end 

Как вы можете видеть, эта операция довольно сложная. Rails не знает, как изменить эту операцию, так что вы должны написать обратный код операции в self.down:

def self.down 
    add_column :users, :username, :string 
    say_with_time 'Join name and surname into username' do 
     User.all.each do |user| 
     user.update_attributes(username: "#{user.name} #{user.surname}") 
     end 
    end 

    remove_column :users, :name 
    remove_column :users, :surname 
end 

и то все ...

+0

Спасибо так много! –

+0

Добро пожаловать :-) –