具有多个参数的虚拟属性

时间:2012-10-30 05:20:49

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

我有以下功能可以正常使用

def holiday_hours_for(holiday)
  hours["holiday_hours"][holiday.to_s] if hours["holiday_hours"][holiday.to_s]
end

我刚刚学习虚拟属性,并且在查找此函数的setter版本时遇到了一些麻烦。我将如何实现这一功能...

def holiday_hours_for(holiday)=(hours)
  self.hours["holiday_hours"][holiday.to_s] = hours if hours["holiday_hours"][holiday.to_s]
end

谢谢!

更新:我想出了以下内容,这是最好的方法吗?

  def update_holiday_hours_for(holiday, hours_text)
    self.hours = Hash.new unless hours
    self.hours["holiday_hours"] = Hash.new unless hours["holiday_hours"]
    self.hours["holiday_hours"][holiday.to_s] = hours_text.to_s
  end

1 个答案:

答案 0 :(得分:0)

要理解的重要一点是,setter方法最后定义为“=”符号。像这样:

def holiday_hours=(some_parameters)
  # some code
end

这类似于实例变量@holiday_hours的setter方法。方法名称为“holiday_hours =”,它会根据您的应用中的要求获取一个或多个参数,以获取属性@holiday_hours的值。当Ruby看到像

这样的代码时
holiday.holiday_hours = some_value

它会调用您定义的setter方法。尽管此赋值中有一些空格不在setter方法中。 Ruby将此赋值解释为

holiday.holiday_hours=(some_value)

使用参数some_value

在假日对象上调用holiday_hours =方法

从你的帖子中不清楚你的示例方法所在的类是什么,我可以猜出变量hours_text是什么,但参数假期是什么?