ActiveRecord Migration 初級演練


在看完先前幾篇有關ActiveRecord的解說,本篇進行一次實際操作,調整資料庫並觀看實際結果。

開啟新專案

$ rails new activerecord

建立model及資料

首先產生model檔案,開始進行資料庫管理:

$ rails g model post title:string content:text

接著我們可以使用rails console來查看資料庫內容。如果你有sequel pro之類的GUI,也可以在裡面進行查看。不過因為我們都是初學,可以多操作練習rails console的使用方法。

$ rails c
$ Post.inspect
(在console中model的名稱第一個字母要大寫)

這時我們會發現有個Table doesn't exist的錯誤,因為我們只在Rails專案中產生檔案,卻沒有移植到資料庫中,所以這時需要先執行:

$ rake db:migrate

接著再回Rails console,重複執行上述方法,就可以看到:

以上是我們在產生model檔案時指定他為我們產生的資料庫內容,看起來無誤!

接著來產生一筆資料:

$ rails console
> Post.create(:title => "This is a post", :content => "This is content")
> Post.first

一樣這時候可以看到我們產生的資料,另外也可以用$y Post.first來看比較有條理的排列。

產生另一個model

接著我們要在產生另一個model叫做comment,附屬於post底下:

$ rails g model comment content:text

接著進行migration將資料寫入資料庫中。

$ rake db:migrate

噗,突然想到,如果要為兩者建立關係,必須在Comment這個model中加入post_id這個欄位,為Rails提供識別。執行:

$ rake db:rollback

資料庫倒車回去,我們重新在migration檔案中加上內容,變成:

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :content
      t.integer :post_id
      # 這行是新增的

      t.timestamps
    end
  end
end

重新執行:$ rake db:migrate就可以囉!

若要真正為兩者建立關係,還必須在model檔案中建立關連才行。

# models/post.rb
class Post < ActiveRecord::Base
  has_many :comments
end

# models/comment.rb
class Comment < ActiveRecord::Base
  belongs_to :comments
end

藉由belongsto和hasmany這種簡單明白的描述,我們就將post和comment建立起關係了。由於本篇專注講解migration的部份,往後的篇章再來詳細說明model檔案如何撰寫。

從seed產生資料

接下來我們要在資料庫中建立多筆資料,為的是平常在開發系統時,會因為設計排版、功能測試等情況,需要先有幾筆資料當做範例。

我們進入專案中的db/seed.rb檔案,撰寫如下:

10.times do
    title = "This is title"
    content = "This is content"
    Post.create(:title => title, :content => content)
    Post.first.comments.create(:content => content)
end

以上會產生10筆內容相同的post,並且在第1筆post底下產生10筆內容相同的comment。撰寫完成存檔,回到terminal,執行:

$ rake db:seed

Rails會去執行seed.rb裡面的檔案,這時我們再進入Rails console裡面查看:

$ rails c
$ Post.all
$ Comment.all

這幾個指令都可以讓我們看到seed.rb檔案產生出來的內容。

最後,如果開發完成,需要把整個資料庫清空,可以執行:

$ rake db:drop db:create db:migrate

或者是用清空model的方式:

$ rails console
> Post.delete_all
> Comment.delete_all

以上方法二擇一執行以後,再執行檢查指令,就可以看到乾淨的資料庫囉~

這樣實際操作過一遍,各位有比較熟練了嗎?

CC圖片授權:ajmexico