2014-02-23 95 views
0

我寫了一個小代碼來測試我的模型Icd3Code的有幾個值,這些值的長度大於255。我這樣做是因爲我首先將模型中的所有字段定義爲text,但並非所有屬性都需要這麼多空間!所以我想一些屬性改變爲string檢查模型的屬性

我的代碼:

arr = Icd3Code.new.attributes.keys 

Icd3Code.all.each do |f| 
    arr.each do |a| 
     if f.a.length >= 255 
      puts a 
     end 
    end 
end 

Icd3Code.new.attributes.keys

給了我這樣的輸出和那一個問題: ["id", "abrechenbar", "alter_fehler", "alter_o"因爲所有strings

就是說f.a.length返回一個錯誤:

method_missing': undefined method `a' for #<Icd3Code:0x7f395f0> (NoMethodError) 

我怎麼能解決這個問題?謝謝

+2

如果你碰巧使用PostgreSQL作爲數據庫注意有沒有*使用文本,而不是爲varchar(字符串)數據類型時發生*空間或性能損失。 –

+0

@AndrewMarshall這是一個很好的觀點!我不知道!你必須知道新的PostgreSQL!在問這個問題之前,我試圖將我的sqlite3數據庫更改爲postgresql!不知何故,我總是得到錯誤'類型varching(255)長'或類似的東西!所以我改變了我的遷移到文本!然後試圖找出至極的屬性阻止了我的'db:seed'!但如果你說沒有性能損失,我的問題是無用的哈哈!謝謝!也許你可以發佈答案? –

+1

我的評論並沒有像現在這樣真正回答你的問題,並且對於其他數據庫來說,實際的答案仍然有用,但這不是真的':)'。 (在PostgreSQL中,varchar實際上是在文本之上實現的,這就是爲什麼這是真的。) –

回答

2

您只需將f.a.length替換爲a.length即可。

我認爲你需要檢查值而不是屬性的關鍵。 這裏是更新的代碼

Icd3Code.all.each do |f| 
    f.attributes.values.each do |a| 
     if a.length >= 255 
      puts a 
     end 
    end 
end 
+0

對不起,但我不想檢查字段描述是否比'255'更長!我想檢查一下'f.abrechenbar'的值是否大於'255'!你明白我的意思嗎?對不起我英文不好 –

+0

@JohnSmith檢查我更新的答案 –