2013-04-24 75 views
1

我試圖在遷移過程中創建記錄,但我遇到了麻煩(之前在我的高級開發人員的幫助下),並且試圖複製他完成的工作,但似乎沒有要在數據庫中創建屋頂安裝記錄...在遷移過程中創建初始記錄

繼承人的遷移文件

class PageEditor < ActiveRecord::Base; end 

def create_initial_record 
    PageEditor.create({ 
    :title => 'Events & Training', 
      :content => '' 
    }) 
    PageEditor.create({ 
    :title => 'Roof Mount - Training', 
      :content => '' 
    }) 
end 

class CreatePageEditors < ActiveRecord::Migration 
    def up 
    create_table :page_editors do |t| 
     t.string :title 
     t.text :content 

     t.timestamps 
    end 

    create_initial_record 
    end 

    def down 
drop_table :page_editors 
    end 
end 

所以我說 - 培訓的一部分,然後跑了耙分貝:遷移,但它不創建記錄並且不會顯示在我的索引頁上.......

+0

我覺得我和你提到的帖子做同樣的事情,但它不會因爲某些原因添加該字段.....任何幫助將不勝感激 – user1502223 2013-04-24 20:37:56

回答

7

請參閱http://edgeguides.rubyonrails.org/migrations.html#migrations-and-seed-data

一個更好的辦法是使用Rails的 '種子' 功能:在db/seeds.rb文件:

PageEditor.create({:title => 'Events & Training', :content => ''}) 
PageEditor.create({:title => 'Roof Mount - Training', :content => ''}) 

然後運行rake db:seed

+1

我聽說過,但我不想偏離很大程度上取決於我的高級開發人員所做的......爲什麼只添加另一個PageEditor.create而不工作?非常沮喪....謝謝你的提示,雖然 – user1502223 2013-04-24 20:41:46

+0

我只是要去你的解決方案!非常感謝,非常簡單,乾淨,像魅力一樣工作 – user1502223 2013-04-24 20:46:53

3

那麼最簡單的辦法是這樣寫add_values_to_page_editors

另一個遷移

class AddValuesToPageEditors < ActiveRecord::Migration 
    def up 
    page_editor1 = PageEditor.create!({:title => 'Events & Training', :content => ''}) 
    page_editor2 = PageEditor.create!({:title => 'Roof Mount - Training', :content => ''}) 
    end 

    def down 
    page_editor1 = PageEditor.find_by_title('Events & Training') 
    page_editor1.destroy 
    page_editor2 = PageEditor.find_by_title('Roof Mount - Training') 
    page_editor2.destroy  
    end 
end 
2

在您的遷移,而不是

create_initial_record

使用

PageEditor.create_initial_record!

希望這將是work.This你想創建表後:-)

3

嘗試PageEditor.reset_column_information的解決方案。否則,ActiveRecord將基於舊數據進行操作。

您還應該考慮在遷移中嵌入骨架版本PageEditor。這樣可以避免驗證過程中出現問題,從而導致您的create調用,或者更高版本的模型干擾了以前沒有預料到的舊遷移。例如:

class ManufactureWidgets < ActiveRecord::Migration 
    class Widget < ActiveRecord::Base; end 
    def change 
    create_table :widgets do |t| 
     t.timestamps 
    end 

    Widget.reset_column_information 
    Widget.create! 
    end 
end 

重要的是要記得,遷移是始終運行建立一個數據庫是很重要的。它們應該用於從一個模式遷移到另一個模式,並且在更穩定的環境中部署時,通常運行rake db:schema:load,它完全繞過遷移,並且簡單地基於schema.rb中的信息構建數據庫。

不幸的是,種子數據在Rails中執行得不好,但是有很多第三方庫在處理這個問題時有不同的哲學。如果您是已經在遷移中嵌入種子數據的項目的初級開發人員,則應該將其標記給高級開發人員並提出更改;當這是不適當或不可行的時候,簡單地遵循既定模式是適當的。

+0

我更喜歡在我的遷移中不使用模型類。如果我需要在遷移中刪除某些數據,那麼我可以通過SQL和'connection.execute'手動完成。通過這種方式更容易地保持遷移和模型不同步;你的骨架模型類應該達到相同的效果。 – 2013-04-24 21:24:15

+0

@ muistooshort有時會使用SQL,但有時您最終還是會將相當數量的邏輯移植到SQL以獲得相同的效果。這是我認爲Rails的遷移/數據庫工具不足的原因之一。如果你擔心Rails正在加載'app/models/widget.rb',你不需要感謝這個範圍:'ManufactureWidgets :: Widget'首先被解析,所以你的遷移不會使用'YourApp :: Widget'。 – coreyward 2013-04-25 18:44:37

+0

我在遷移中使用模型時遇到的問題是數據庫與遷移期望的一樣,數據庫與模型期望的一樣往往不同:關聯可能更改,表可能被刪除或創建,列可能被添加或刪除,驗證約束可能不一樣等等。因此,無論是使所有模型的本地副本都涉及到,還是使用SQL來完成。我認爲整個Rails對數據庫的態度都很差,整個「數據庫中沒有邏輯」的態度有點荒謬和短視。儘管確定範圍的好點。 – 2013-04-25 19:12:14