2014-10-27 13 views
3

我不得不將execute放到一個表中遷移。它看起來像這樣:不在schema.rb中生成的遷移代碼?

class CreateFoos < ActiveRecord::Migration 
    def up 
    create_table :items do |t| 
     t.integer :bar 
    end 

    execute("GRANT SELECT ON items TO otheruser;") 
    end 

    def down 
    drop_table :items 
    end 
end 

這種運作良好,但db/schema.rb文件,這應該是對數據庫的創建權限,卻丟失了符合execute命令。

有什麼我很想念,或者這是schema.rb生成時的默認行爲?

我可以通過簡單忽略schema.rb並在部署時生成帶有rake db:migrate的表格來繞過此問題,但我看到了避免這樣做的建議。

任何想法?

+0

我從來沒有見過「GRANT」顯示在schema.rb只有'tables'和'indexes'。另外,你在哪裏找到避免使用'rake db:migrate'的建議? – 2014-10-27 14:40:28

回答

3

Active Record的模式轉儲程序無法處理數據庫特定的項目,如外鍵,約束,授權語句等。將數據庫格式更改爲sql而不是ruby。在你的application.rb中的文件:

config.active_record.schema_format = :sql 

這將使用數據庫的特定工具的架構轉儲到db/structure.sql。例如,如果您使用PostgreSQL,它將使用pg_dump來轉儲模式。使用sql格式的缺點是轉儲不再是數據庫不可知的。如果您要從PostgreSQL遷移到MySQL,您將無法使用生成的結構文件來創建新的數據庫。

您還可以生成耙命令SQL轉儲:

rake db:structure:dump