为什么rails在设置后更改属性的类型_是值?

时间:2012-09-19 08:36:21

标签: ruby-on-rails ruby activerecord

我的模型中有一个属性,它存储为文本但被解释为理性。我有这个方法来处理:

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" 

1 个答案:

答案 0 :(得分: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

如您所见,如果属性未实际更改,则只需调用自己的getter,在您的情况下按下执行转换的start方法。但是,如果该属性实际更改,它将从changed_attributes存储中读取其原始值。