从方法的值设置属性

时间:2012-05-01 17:34:48

标签: ruby-on-rails-3 rails-models

我确信我只是做错了,有人能指出我正确的方向吗?

我需要将effective_date的值设置为修改后的格式日期

effective_date是Request

的属性
class Request < ActiveRecord::Base

  def format_date=(format_date)
    date_a = format_date.split("/")
    month, day, year = date_a
    effective_date = Date.parse("#{year}-#{month}-#{day}")
  end

  def format_date
    effective_date
  end
end

Request.create(format_date: "04/21/2012")未将值设置为effect_date

编辑:我想这没有意义,所以我会尝试更好地解释它:

我需要从format_date(不是数据库中的列)设置effective_date(数据库中的列)的值。我使用format_date方法从format_date转换日期并将其存储到effective_date。如果这还不够,请告诉我。我不知道还有什么要补充的。

2 个答案:

答案 0 :(得分:2)

如果effective_date是数据库中的列名,则更改就像

一样简单
def format_date=(format_date)
  date_a = format_date.split("/")
  month, day, year = date_a
  self.effective_date = Date.parse("#{year}-#{month}-#{day}")
end

唯一的变化是effective_date =self.effective_date =。如果不在其中添加self,则解释器无法知道您是要设置名为effective_date的局部变量还是调用effective_date=方法。它假设局部变量。

答案 1 :(得分:1)

如果effective_date是属性但不在表中,那么我认为你需要实例变量。

class Request < AR::Base
  ...
  def format_date=(f_date)
    ...
    @effective_date = Date.parse("#{year}-#{month}-#{day}")
  end

  def format_date
    @effective_date
  end
end

另外,使用名称作为方法名称(format_date)的局部变量并不好,这里没有错,但它有点误导。

更新:您可以在此处查看更多aboute虚拟属性:

http://railscasts.com/episodes/16-virtual-attributes?view=asciicast

http://railscasts.com/episodes/167-more-on-virtual-attributes