Validations und virtuelle Attribute

Sep 2007
11

0 Kommentar(e)

Eingetragen von Martin Maciaszek

Manchmal möchte ich (virtuelle) Attribute im Model haben, die sich nicht 1:1 auf Spalten in einer Tabelle abbilden lassen. Ein gutes Beispiel dafür ist mein Machine-Model. In dem Model möchte ich unter anderem das Baujahr der Maschine festhalten. Dies könnte ich zwar auch einfach als ein Integer in der Datenbank speichern, doch für diverse Datumsberechnungen habe ich mich dazu entschlossen, das Baujahr als Datum (jeweils als den 1. Januar des Jahres) zu speichern. Das Baujahr habe ich zu einem virtuellen Attribut es Models gemacht. Das ganze sieht dann so aus.

class Machine < ActiveRecord::Base
  def build_year
    read_attribute(:built_on).year if read_attribute(:built_on)
  end

  def build_year=(year)
    write_attribute(:built_on, Date.new(year.to_i, 1, 1)) unless year.empty?
  end
end

Damit läßt sich nun build_year wie jedes andere Attribut des Models in Views verwenden. Wie wäre es noch mit Validations? Hierzu habe ich folgende validate-Methode gebaut.

def validate
  errors.add(:build_year, "can't be blank") unless build_year.is_a?(Fixnum) 
  errors.add(:build_year, "must be after 1944") if build_year && build_year<1945
  errors.add(:build_year, "can't be in the future") if build_year && build_year>Date.today.year
end

Damit wird mein virtuelles Attribut nun auch entsprechend im View hervorgehoben, wenn die Validation fehlschlägt.


Hinterlasse einen Kommentar