3

モデルに、テキストとして保存されているが有理数として解釈される属性があります。私はそれを処理するためにこのメソッドを持っています:

def start
  read_attribute(:start).to_r
end

start属性を新しい値に設定すると、start_wasヘルパーメソッドは有理数ではなく文字列を返しますが、その前に正しい値を返します。なんで?

Loading development environment (Rails 3.2.8)
1.9.3p194 :001 > d = Day.find(55)
  Day Load (8.7ms)  SELECT "days".* FROM "days" WHERE "days"."id" = ? LIMIT 1  [["id", 55]]
 => #<Day id: 55, date: "2012-03-30", start: "1/2", finish: "2/2", created_at: "2012-09-18 15:16:42", updated_at: "2012-09-19 08:20:41", day_year_id: 1> 

1.9.3p194 :002 > d.start_was
 => (1/2) 

1.9.3p194 :003 > d.start=0
 => 0 

1.9.3p194 :004 > d.start_was
 => "1/2" 
4

1 に答える 1

2

その理由は、ActiveModel(activemodel-3.2.8 \ lib \ active_model \ dirty.rb)のこのメソッドにあると思います

# Handle <tt>*_was</tt> for +method_missing+.
def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end

ご覧のとおり、属性が実際に変更されていない場合は、独自のゲッターを呼び出すだけです。この場合start、変換を行うメソッドをヒットします。ただし、属性が実際に変更された場合は、changed_attributesストレージから生の値を読み取ります。

于 2012-09-19T12:28:34.823 に答える