Ruby on rails Rails:模型和模型模板交互
使用:Ruby on Rails(3.0.3) 我正在建立一个网站,在那里人们可以进行不同的健康和饮食相关的计算 每个计算包含不同的输入: 计算1 身高、体重、腰围 计算2 体重、臀围和臀围测量 计算3 臀部测量、生活方式类型(字符串)、年龄、卡路里摄入量 ……等等 我(根据一位了解RoR的朋友的建议)创建了一个模型“Calculation”(作为模板)和另一个模型“CalculationSheet”,将用作实例模型等 模型:计算(模板)包含以下数据: -计算类型(“健康”、“生活方式”等) -搜索标签 -isSpecial(用于隔离某些特殊计算的布尔值) 网站上计算对象的数量与计算“类型”的数量一样多(如我前面提到的3个) 型号:计算表将仅保存以下数据: -结果(如BMI=>22) 使用Create在网站上执行计算时,将创建计算表。我不需要保存这些计算(不希望实际保存) 使用CalculationSheet模型的最重要原因是能够验证输入,这就是问题所在 问题: 如何验证不将每个输入作为属性保存的模型中的输入。我无法为每种类型的输入设置属性(实际上有100个),例如身高、体重、生活方式、腰围、年龄等 这是我目前的计划:Ruby on rails Rails:模型和模型模板交互,ruby-on-rails,ruby,model,validation,Ruby On Rails,Ruby,Model,Validation,使用:Ruby on Rails(3.0.3) 我正在建立一个网站,在那里人们可以进行不同的健康和饮食相关的计算 每个计算包含不同的输入: 计算1 身高、体重、腰围 计算2 体重、臀围和臀围测量 计算3 臀部测量、生活方式类型(字符串)、年龄、卡路里摄入量 ……等等 我(根据一位了解RoR的朋友的建议)创建了一个模型“Calculation”(作为模板)和另一个模型“CalculationSheet”,将用作实例模型等 模型:计算(模板)包含以下数据: -计算类型(“健康”、“生活方式”等) -
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
类计算表true,:如果=>:计算\u是否为\u bmi?
验证:权重,:数值=>true,:如果=>:calculation\u是\u bmi?
def计算是bmi吗?
#做点什么
结束
结束
这(显然)不起作用。它尝试验证不存在的高度
我想做的是“验证参数[:height],:numer…等等”,但它似乎也不起作用
如何解决这个问题?诀窍在于您的评论“我不需要保存这些计算”: ActiveRecord旨在为数据提供持久性(即保存)如果您只是想进行计算,可以使用普通的旧ruby对象:)
有了这样的东西,我很想建立一个小库(现在可能在/lib中,以后作为gem)来进行计算。您可以使用
ActiveModel
而不是ActiveRecord
,如下所示:
class CalculationSheet
include ActiveModel::Validations
attr_accessor :height, :weight
validates_numericality_of :height, :weight
end
这将允许对每个属性进行表单验证,但不存储任何内容。这里是Yehuda Katz关于ActiveModel
的一篇精彩文章:
对于Rails 3,使用验证\u和来使用自定义验证程序。
有关如何使用它们的信息,请参阅
编辑:
这个怎么样:
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
这就是我现在的解决方案,它可以很好地执行计算。不过,这并不能使执行验证成为可能…@Michaeldurrent:我不理解你的评论。什么?我能做到这一点,这是前进的一大步。然而,我下一个重要的问题是,我如何才能使这个通用化,以便我可以使用相同的模型创建(并验证):计算A的身高和体重,然后创建:计算B的腰围、臀围和:体重?我认为您自己的:if=>计算是bmi?
的想法会奏效。(虽然我自己会简单地称这个函数为bmi?
)或者这不解决你的问题吗?我在回答中添加了一个更广泛的例子。这就解决了它!(或者至少是我询问的部分)…我正在使用另一个变量,我在bmi方法中使用该变量进行验证。基本上,@calculation=='bmi'返回真/假…谢谢!!