Rails:模型和模型模板交互

时间:2011-09-25 10:22:51

标签: ruby-on-rails ruby model validation

使用: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 ......等等”,但它似乎也不起作用......

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以使用ActiveModel代替ActiveRecord,如以下所示:

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

这将允许每个属性的表单验证,但您不存储任何内容。以下是Yehuda Katz关于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

答案 1 :(得分:0)

诀窍在于你的评论“我没有必要保存这些计算”:

ActiveRecord就是为您的数据提供持久性(即保存)。 如果您只是想进行计算,可以使用普通的旧红宝石对象:)

对于这样的东西,我很想建立一个小库(可能现在在/ lib中,以后作为宝石)进行计算。