2011-02-13 144 views
1

我正在通過Ruby on Rails tutorial工作,並僅創建了一個帶有三個屬性的Comment模型。Rails模型屬性位置

rails generate model Comment commenter:string body:text post:references 

它產生一個ActiveRecord類post但不commenterbody

class Comment < ActiveRecord::Base 
    belongs_to :post 
end 

爲什麼rails沒有正式定義除數據庫遷移腳本以外的任何地方的非引用屬性?

回答

2

Rails根據數據庫模式動態加載屬性 - 特別是列的名稱及其類型 - 。無需在模型中定義或聲明它們。對於在生產中運行的應用程序,它在加載時執行一次。對於開發,它將按照每個請求的頻率重新加載它們,但僅在使用每個模型時加載它們。

儘管如此,Rails並不會從數據庫中推斷出其他東西。例如,如果您要在name列中放置唯一索引,則它不會自動將validates_uniqueness_of :name添加到您的模型中。當然,如果名稱字段包含重複值,則在保存記錄時數據庫仍然會強制執行此約束,導致引發異常。在這種情況下,建議是要同時做到這兩點。

1

爲什麼rails沒有正式定義除數據庫遷移腳本以外的任何地方的非引用屬性?

那麼,你需要在哪裏「定義」呢?遷移是這些屬性唯一重要的地方,因爲它的責任是創建具有這些屬性的數據庫表。

如果您對具有類似參數的註釋執行腳手架,它也會生成視圖並使用屬性。他們不需要在其他地方被「定義」。

1

你的問題的簡短答案是「否」。即使遷移也不是一個明確的地方,因爲可能會有許多與模型相關的遷移。

但是,您可能會看看生成的「db/schema.rb」,它是所有遷移的聚合。它包含所有主動記錄模型的模式定義。這也許是你最好的選擇。

另外,您可能需要使用https://github.com/ctran/annotate_models插件,在您的模型中插入註釋以幫助您跟蹤所有模型的屬性。