如何覆盖模型中另一个虚拟属性的属性?

时间:2012-05-01 10:39:25

标签: ruby-on-rails ruby-on-rails-3 virtual-attribute

我有一个虚拟属性start_date和一个数据库列start(日期时间)。

如何使用start的日期覆盖start_date的日期(而非时间)?

我在setter方法中尝试了这个,并且logger说self.start / start已设置,但是在数据库中,更新日志start仍然是旧日期。

# model: db table with columns: id(int), start(datetime)
class DateTimeTest < ActiveRecord::Base

  attr_accessible :start_date, :start

  def start_date=(value)
    logger.debug '>>>>' + start.inspect
    logger.debug '>>>>' + self.start.inspect
    start = DateTime.new(value.to_date.year, value.to_date.month, value.to_date.mday, 15,15,15)
    self.start = DateTime.new(value.to_date.year, value.to_date.month, value.to_date.mday, 15,15,15)
    logger.debug '>>>>' + start.inspect
    logger.debug '>>>>' + self.start.inspect
  end

end

# view
<%= simple_form_for(@datetimetest) do |f| %>
  <%= f.input :start_date, :as => :string %>
  <%= f.input :start %>
  <%= f.button :submit %>
<% end %>

# controller is a base scaffolding controller

在日志中,我可以看到start已填充:

Parameters: {..., "datetimetest"=>{"start_date"=>"03.05.2012", "start(1i)"=>"2012", "start(2i)"=>"5", "start(3i)"=>"1", "start(4i)"=>"13", "start(5i)"=>"05"}

1 个答案:

答案 0 :(得分:1)

DateTime分解为年,月,月,小时,分钟和秒,但不方便地分为日期和时间。

def start_date(value)
  start = DateTime.new(value.year, value.month, value.mday,
                       start.hour, start.minute, start.second)
  logger.debug self.start.inspect
end