спасибо за чтение моей книги!
Как уже объясняли JacobM и dbalatero, это новая функция в Rails 3.1. Эта особенность была добавлена Аароном Паттерсоном как способ упростить синтаксис миграции. В более ранних версиях Rails вы должны были делать, как показано в книге:
class CreatePurchases < ActiveRecord::Migration
def self.up
create_table :purchases do |t|
t.string :name
t.float :cost
t.timestamps
end
end
def self.down
drop_table :purchases
end
end
Но это своего рода повторение. Аарон создал синтаксис переноса, который выглядит хорошо и проще, вызывая только методы, необходимые для переноса вперед, но также разрешая переносы назад (также известные как «откат»). Та же самая миграция, написанная с помощью синтаксиса Rails 3.1, такова:
class CreatePurchases < ActiveRecord::Migration
def change
create_table :purchases do |t|
t.string :name
t.float :cost
t.timestamps
end
end
end
Таким образом, когда эта миграция запускается «вперед», Rails создаст таблицу покупок с полями. Когда вы откатите его назад (или запустите «назад»), Rails узнает, что нужно сбросить таблицу.
Однако этот синтаксис не совсем совершенен, и у вас возникнут проблемы с такими методами, как change_column
. Когда это происходит, лучше всего придерживаться определения методов def up
и def down
в миграциях:
class CreatePurchases < ActiveRecord::Migration
def up
change_column :purchases, :cost, :integer
end
def down
change_column :purchases, :cost, :float
end
end
Это потому, что в этом примере Rails не будет знать, как переключить его обратно на предыдущий тип. Я надеюсь, что это объясняет это лучше!