2009-08-20 16 views

回答

2

作爲記錄在其他地方,有事情可以做,但我會建議他們」從長遠來看,可能會比咬子彈和重命名專欄更麻煩。

如果你的數據庫是不開放給其他的應用程序,那就是 - 否則你只是要受到一定程度上無論你做什麼...

爲什麼改名?我們從Rails獲得的最大好處之一是約定優於配置。 「魔術」,如果你願意的話。 (有人說這實際上是一件壞事,但請跟我一起)。如果你保留一個名爲「valid」的列,那麼你就會讓你的模型不一致:這個列需要與其他列不一樣,這很糟糕。或者你也許可以修補ActiveRecord :: Base,然後你的所有模型都可以工作,但是你的應用不再遵循約定。

從個人經驗:我創建了一個名爲「user_id」的列,按照慣例,ActiveRecord認爲是一個外鍵(因爲它以「_id」結尾)。我圍繞它編碼,現在我認爲這是一個錯誤。另一個項目在待辦事項列表中...

違反Rails約定並不一定是錯誤的:有很多地方你可以這樣做,而且它們有很好的文檔記錄。在ActiveRecord方面,很多都是專門設計的,以減少連接到傳統數據庫模式的難度。仔細看看正面和反面,正如你明顯所做的那樣,並權衡你的選擇。

+0

我在我的第一個軌道應用程序上做到了這一點。我有一個名爲「圖像」的專欄(或者可能是一張桌子),我一想到爲什麼我的應用程序被破壞,就重新命名了它。 – 2009-08-20 20:18:14

+1

同意,重命名該列。這從長遠來看會導致更少的混淆。如果我看到「model.valid」,我認爲它與Rails驗證有關(不是像這種情況下的屬性)。 – ryanb 2009-08-20 20:46:20

+0

我同意,通過公約的權力。但是,我正在使用我的黑客,直到我可以安排我的家屬進行更改。 – 2009-08-21 06:20:51

1

我可以通過添加以下到我的模型防止死機,但它並不完全令人滿意:

class << self 
    def instance_method_already_implemented?(method_name) 
    return true if method_name == 'valid?' 
    super 
    end 
end 
+0

這實際上幫助了我;我不得不使用'method_name.include? '屬性',因爲我正在處理的遺留數據庫中的一列被命名爲'屬性'。一個主要的PITA,但現在... – 2011-11-01 21:22:12

0

你需要看到你的模型中的列?如果沒有,覆蓋的ActiveRecord :: Base.columns會做的伎倆......

def self.columns 
    super.delete_if {|c| c.name == 'valid' } 
end 
0

您可以通過[]符號訪問屬性:

row[:valid] = "foo" 

你會得到DangerousAttributeError如果嘗試初始化一個對象是這樣的:

row = MyModel.new :valid => "foo" 

爲了防止這種情況,你可以定義一個屬性setter方法有效,就像這樣:

def valid=(x) 
    self[:valid] = x 
end 

有效嗎?方法仍將用於行驗證。你可以定義一個不同的問題方法,比如val?得到的布爾值,像這樣:

def val? 
    query_attribute('valid') 
end 

現在你可以使用row.val?測試布爾

相關問題