2011-09-25 63 views
0

使用:Ruby on Rails的(3.0.3)的Rails:模型和模型模板互動

我建立一個網站,一個可以執行不同的健康和飲食相關的計算。

每個計算持有不同輸入:

計算1 身高,體重,waist_measurement

計算2 重量,hip_measurement

計算3 hip_measurement,lifestyle_type (ST戒指),年齡,calory_intake

...等等。

我有(從誰知道RoR的朋友一個建議)創建的模型「計算」(意思爲模板),並且將被用作一個實例模型等

另一種模式「CalculationSheet」型號:計算(模板)保存數據,如: - TypeOfCalculation(「健康」,「生活方式」等) - SearchTags - isSpecial(一個布爾隔離某些特殊計算)

有儘可能多的計算對象作爲網站上有計算「類型」(如前面提到的3)

型號:CalculationSheet將只保存數據,如: - 結果(如BMI => 22)

在使用創建的網站上執行的計算的CalculationSheet將被創建。我不需要保存這些計算(實際上並不喜歡)。

使用CalculationSheet模型的最重要的原因是能夠驗證輸入 ...這是問題所在。

問題: 如何驗證輸入,從沒有保存每個輸入作爲屬性的模型。我不能讓一個屬性爲每個類型的輸入(字面上有100的),如身高,體重,life_style,腰,年齡等...

這是我的計劃,作爲現在:

class CalculationSheet < ActiveRecord::Base 
    belongs_to :calculation 

    # BMI 
    validates :height, :numericality => true, :if => :calculation_is_bmi? 
    validates :weight, :numericality => true, :if => :calculation_is_bmi? 

    def calculation_is_bmi? 
    # do something 
    end 
end 

哪(顯然)不起作用。它試圖驗證不存在的高度。

我想什麼做的是「只會驗證PARAMS [:高度]:NUMER ...等」,但它似乎並沒有工作,要麼...

我該如何解決這個問題?

回答

1

可以使用ActiveModel代替ActiveRecord所示這些線:

class CalculationSheet 
    include ActiveModel::Validations 
    attr_accessor :height, :weight 
    validates_numericality_of :height, :weight 
end 

這將允許每個屬性的表單驗證,但你不存儲任何。這裏有一個偉大的職位由耶胡達·卡茨約ActiveModelActiveModel: Make Any Ruby Object Feel Like ActiveRecord

對於Rails 3中使用validates_with使用自定義的驗證。 有關如何使用它們的信息,請參閱this great post

編輯

如何:

class CalculationSheet 
    include ActiveModel::Validations 
    attr_accessor :height, :weight, :hip_circumference 
    validates_numericality_of :height, :weight, :if => :bmi? 
    validates_numericality_of :height, :hip_circumference, :if => :bai? 

    def bmi? 
    [height, weight].all?(&:present?) 
    end 

    def bmi 
    weight/(height**2) 
    end 

    def bai? 
    [height, :hip_circumference].all?(&:present?) 
    end 

    def bai 
    (hip_circumference/height**1.5) − 18 
    end 

end 
+0

@MichaelDurrant:我不明白你的意見。什麼? – rdvdijk

+0

可以聊天聊天 –

+0

我可以做這項工作,這是一個很好的舉措。然而,我的下一個重要的問題是**我怎樣才能製作這個通用的**所以我可以創建(並驗證):計算A的高度&:重量然後:計算B的腰圍:臀圍和重量:使用相同的型號? – Christoffer

0

技巧是在您的評論:「我沒有必要保存這些計算」:

ActiveRecord的是所有關於你的數據提供持久性(即保存)。 如果你只是想這樣做計算,你可以使用普通的老式Ruby對象:)

有了這樣的東西我會忍不住,現在建一個小圖書館(也許在/ lib和作爲寶石後)做你的計算。

+0

這幾乎是我的解決方案,現在,工作正常進行的計算。它不能通過執行驗證... – Christoffer