2012-06-12 18 views
0

在編寫Rails應用程序時,有幾個需要字符串表列寬度的地方:驗證,RSpec測試,輸入表單等。似乎值得設置DB中字符串的長度限制。要幹,我可以訪問ActiveRecord中的字符串列寬度限制嗎?

目前我已經在模型中設置了LENGTHS散列,所以我可以在其他地方訪問長度並在這方面保持代碼乾燥。如果我在DB中設置了長度限制,是否可以從那裏讀取值(或者用它們初始化LENGTHS哈希值)以使代碼更幹?也就是說,讀取模型中數據庫列的字符串長度限制的代碼是什麼,以便我可以使用它?

+0

將這種配置(靜態)保存在數據庫中是一個非常糟糕的主意,因爲您的應用程序需要訪問數據庫,即使它只是加載本身,並沒有真正做任何工作。 –

+0

從我讀過的模式數據在啓動時加載,所以沒有額外的數據庫訪問。我認爲DRYness通常有很多好處。請參閱:http://devblog.avdi.org/2011/10/20/drying-up-your-validations-using-db-reflection/ –

回答

1

您可以訪問AR模型的列方法。

Model.columns.map(&:limit) 
Model.columns.map(&:name) 
Model.columns.map(&:null) 
Model.columns.map(&:sql_type) 
... 

所以,你可以用這種方法來構建你的散列/陣列/不管。 我相信長度 attibute你說的是限制在這個表示法。

0
class ActiveRecord::Base 
    def self.method_missing(method_id, *args) 
    if self.columns_hash.has_key?(method_id.to_s) 
     self.columns_hash[method_id.to_s] 
    else 
     super 
    end 
    end 
end 

這允許以乾淨的方式訪問由columns_hash提供的任何列模式數據。因此:

Model.column_name返回所有可用的數據

Model.column_name.hash_key返回感興趣

一個值。例如哈希: Company.contact_name.limit返回contact_name列的最大長度。 從我讀過的內容來看,DB在啓動時加載模式數據,因此不會發生數據庫命中,並且會記錄數據。

相關問題