Ruby on rails Rails:模型和模型模板交互

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”,将用作实例模型等 模型:计算(模板)包含以下数据: -计算类型(“健康”、“生活方式”等) -

使用:Ruby on Rails(3.0.3)

我正在建立一个网站,在那里人们可以进行不同的健康和饮食相关的计算

每个计算包含不同的输入:

计算1 身高、体重、腰围

计算2 体重、臀围和臀围测量

计算3 臀部测量、生活方式类型(字符串)、年龄、卡路里摄入量

……等等

我(根据一位了解RoR的朋友的建议)创建了一个模型“Calculation”(作为模板)和另一个模型“CalculationSheet”,将用作实例模型等

模型:计算(模板)包含以下数据: -计算类型(“健康”、“生活方式”等) -搜索标签 -isSpecial(用于隔离某些特殊计算的布尔值)

网站上计算对象的数量与计算“类型”的数量一样多(如我前面提到的3个)

型号:计算表将仅保存以下数据: -结果(如BMI=>22)

使用Create在网站上执行计算时,将创建计算表。我不需要保存这些计算(不希望实际保存)

使用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
类计算表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'返回真/假…谢谢!!