Rails: Как мне проверить модель на основе атрибутов родителя? - PullRequest
2 голосов
/ 08 апреля 2011

У меня есть три модели с именами Метрика, Ввод и Измерение:

class Metric < ActiveRecord::Base
  has_many :entries
  attr_accessible :name, :required_measurements, :optional_measurements
end

class Entry < ActiveRecord::Base
  belongs_to :metric
  has_many :measurements
  attr_accessible :metric_id
end

class Measurement < ActiveRecord::Base
  belongs_to :entry
  attr_accessible :name, :value
end

Они связаны, и я могу создать вложенные экземпляры каждого из них следующим образом:

bp = Metric.create(:name => "Blood Pressure", :required_measurement_names => ["Diastolic", "Systolic"])

bp_entry = bp.entries.create()

bp_entry.measurements.create({:name => "Systolic", :value =>140}, {:name => "Diastolic", :value =>90})

Как сделатьЯ проверяю измерения артериального давления на основе атрибута :required_measurement_names в метрической модели?Например, как мне обеспечить, чтобы в качестве измерений вводились только «Систолический» и «Диастолический»?

Есть ли лучший способ настройки этих ассоциаций и проверок?

Спасибо!

1 Ответ

1 голос
/ 08 апреля 2011

Похоже, что запись является моделью соединения между Измерением и Метрикой.поэтому имеет смысл перейти к вашей проверке.

Чтобы обеспечить охват всех необходимых метрик метрик

def validate_required_measurements
  metric.required_measurements.each{ |requirement| 
     unless (measurements.map{|measurement| measurement.name}.includes requirement)
       errors.add_to_base "required measurement #{requirement} is missing"  
     end
  }
end

Чтобы обеспечить включение только принятых метрик (при условии, что необязательные метрики также принимаются).

def validate_accepted_measurements
  measurements.each{ |measurement| 
     unless ((metric.required_measurements + metric.optional_measurements).include measurement.name )
       errors.add_to_base "invalid measurement #{measurement.name} for metric"  
     end
  }
end

Собрав все воедино, добавьте вышеперечисленное и следуйте модели Entry

validate: validate_accepted_measurements, :validate_required_measurements

Примечание: мой Ruby немного заржавел, поэтому после копирования это не гарантируетсяи вставлять, но это должно приблизить вас достаточно, чтобы исправить ошибки синтаксиса, которые произошли.

...