Rails: взаимодействие модели и шаблона модели - PullRequest
0 голосов
/ 25 сентября 2011

Использование : Ruby on Rails (3.0.3)

Я создаю веб-сайт, на котором можно выполнять различные вычисления, связанные со здоровьем и диетой.

Каждый расчет содержит различные входные данные:

Расчет 1 рост, вес, размер талии

Расчет 2 weight, hip_measurement

Расчет 3 hip_measurement, lifestyle_type (string), age, calory_intake

... и т. д.

У меня есть (по предложению друга, который знает RoR, создал модель «Расчет» (которая выступает в качестве шаблона) и другую модель «Расчетный лист», которая будет использоваться в качестве модели экземпляра и т. д.

Модель: расчет (template) содержит такие данные, как: - TypeOfCalculation («здоровье», «образ жизни» и т. д.) - SearchTags - isSpecial (логическое значение для выделения определенных специальных вычислений)

Количество объектов вычисления равно количеству типов вычисленийна веб-сайте (например, 3, о котором я упоминал ранее)

Модель: CalculationSheet будет содержать только такие данные, как: - Результат (например, BMI => 22)

CalculationSheet будет создан, когдаРасчитатьДействие выполняется на сайте с помощью 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

, который (очевидно) не работает.Он пытается проверить высоту, которой не существует.

Что я хотел бы сделать, это "проверить параметры [: высота],: число ... и т. Д.", Но, похоже, это тоже не работает ...

Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Вы можете использовать ActiveModel вместо ActiveRecord, как показано в следующих строках:

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

Это позволит проверять форму каждого атрибута, но вы ничего не сохраняете. Вот отличный пост Иегуды Каца о ActiveModel: ActiveModel: сделать любой объект Ruby похожим на ActiveRecord

Для Rails 3 используйте validates_with, чтобы использовать пользовательский валидатор. См. этот великий пост для получения информации о том, как их использовать.

редактировать

Как насчет этого:

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 голосов
/ 25 сентября 2011

Хитрость в вашем комментарии: «У меня нет необходимости сохранять эти вычисления»:

ActiveRecord - это постоянство ваших данных (т.е. сохранение). Если вы просто хотите выполнять вычисления, вы можете использовать простые старые объекты ruby:)

С такими вещами у меня возникнет соблазн создать небольшую библиотеку (возможно, в / libсейчас и как драгоценный камень позже), который делает ваши расчеты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...