2013-02-16 3 views
2

Как преобразовать эту миграцию в raw sql? или я могу преобразовать?Преобразование Rails в исходный SQL

class AddUnsubscribeTokenToUsers < ActiveRecord::Migration 
    def self.up 
    add_column :users, :unsubscribe_token, :string, :unique => true 
    User.all.each do |user| 
     user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18) 
    end 
    end 
    def self.down 
    remove_column :users, :unsubscribe_token 
    end 
end 

ответ

2

AFAIK вы не можете преобразовать один миграции в SQL, но вы можете иметь выход ActiveRecord вашу схему в SQL вместо Ruby.

# in config/application.rb 

config.active_record.schema_format = :sql 

Это даст вам выход SQL в вашей схеме db/schema вместо Ruby DSL. Но ни один формат не будет содержать фрагмент кода, устанавливающий токен пользователя.

Кроме того, считается, что Bad Idea включает код модификации БД, подобный этому в вашей миграции. Например, что произойдет, если вы избавитесь от этой модели или переименуете ее, когда эта миграция закончится, она потерпит неудачу. По крайней мере, оберните его в чек для модели. или начать/спасение/конца

if defined? User 
    User.all.each do |user| 
    user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18) 
    end 
end 

или

begin 
    User.all.each do |user| 
    user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18) 
    end 
rescue 
end 

И, наконец, что фрагмент кода не будет делать то, что вы хотели, так как вы не сохранение модели после установки маркеров, либо использовать update_attributes или звоните user.save

0

Я наткнулся на very nice article, описывая, как это может быть достигнуто с помощью специальной задачи грабли.