在編寫Rails應用程序時,有幾個需要字符串表列寬度的地方:驗證,RSpec測試,輸入表單等。似乎值得設置DB中字符串的長度限制。要幹,我可以訪問ActiveRecord中的字符串列寬度限制嗎?
目前我已經在模型中設置了LENGTHS散列,所以我可以在其他地方訪問長度並在這方面保持代碼乾燥。如果我在DB中設置了長度限制,是否可以從那裏讀取值(或者用它們初始化LENGTHS哈希值)以使代碼更幹?也就是說,讀取模型中數據庫列的字符串長度限制的代碼是什麼,以便我可以使用它?
在編寫Rails應用程序時,有幾個需要字符串表列寬度的地方:驗證,RSpec測試,輸入表單等。似乎值得設置DB中字符串的長度限制。要幹,我可以訪問ActiveRecord中的字符串列寬度限制嗎?
目前我已經在模型中設置了LENGTHS散列,所以我可以在其他地方訪問長度並在這方面保持代碼乾燥。如果我在DB中設置了長度限制,是否可以從那裏讀取值(或者用它們初始化LENGTHS哈希值)以使代碼更幹?也就是說,讀取模型中數據庫列的字符串長度限制的代碼是什麼,以便我可以使用它?
您可以訪問AR模型的列方法。
Model.columns.map(&:limit)
Model.columns.map(&:name)
Model.columns.map(&:null)
Model.columns.map(&:sql_type)
...
所以,你可以用這種方法來構建你的散列/陣列/不管。 我相信長度 attibute你說的是限制在這個表示法。
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在啓動時加載模式數據,因此不會發生數據庫命中,並且會記錄數據。
將這種配置(靜態)保存在數據庫中是一個非常糟糕的主意,因爲您的應用程序需要訪問數據庫,即使它只是加載本身,並沒有真正做任何工作。 –
從我讀過的模式數據在啓動時加載,所以沒有額外的數據庫訪問。我認爲DRYness通常有很多好處。請參閱:http://devblog.avdi.org/2011/10/20/drying-up-your-validations-using-db-reflection/ –