使用:Ruby on Rails(3.0.3)
我正在建立一个可以执行不同健康和饮食相关计算的网站。
每个计算都包含不同的输入:
计算1 身高,体重,腰围测量
计算2 体重,臀部测量
计算3 hip_measurement,lifestyle_type(string),age,calory_intake
......等等。
我(作为知道RoR的朋友的建议)创建了一个模型“Calculation”(作为模板)和另一个模型“CalculationSheet”,它将用作实例模型等。
模型:计算(模板)包含如下数据: - TypeOfCalculation('健康','生活'等) - 搜索标签 - isSpecial(用于隔离某些特殊计算的布尔值)
计算对象与网站上的计算“类型”一样多(例如我前面提到的3)
模型:CalculationSheet只会保存以下数据: - 结果(例如BMI => 22)
使用Create在网站上执行计算时,将创建CalculationSheet。我没有必要保存这些计算(不想实际)。
使用CalculationSheet模型的最重要原因是能够验证输入 ......这就是问题所在。
问题: 如何验证不将每个输入作为属性保存的模型的输入。我无法为每种类型的输入创建属性(实际上有100个),例如身高,体重,生活方式,腰围,年龄等...
这是我现在的计划:
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 [:height],:numer ......等等”,但它似乎也不起作用......
我该如何解决这个问题?
答案 0 :(得分:1)
您可以使用ActiveModel
代替ActiveRecord
,如以下所示:
class CalculationSheet
include ActiveModel::Validations
attr_accessor :height, :weight
validates_numericality_of :height, :weight
end
这将允许每个属性的表单验证,但您不存储任何内容。以下是Yehuda Katz关于ActiveModel
:ActiveModel: 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
答案 1 :(得分:0)
诀窍在于你的评论“我没有必要保存这些计算”:
ActiveRecord就是为您的数据提供持久性(即保存)。 如果您只是想进行计算,可以使用普通的旧红宝石对象:)
对于这样的东西,我很想建立一个小库(可能现在在/ lib中,以后作为宝石)进行计算。