模块内的访问对象属性

时间:2014-05-18 12:36:53

标签: ruby-on-rails ruby

我有一个属性.weekday的类保存为整数值。

我正在尝试在模块中创建一个方法,将该数值转换为相应的工作日。

这就是我喜欢的工作方式:

MyClass.weekday
=> 2
MyClass.weekday.my_module_method
=> "Tuesday"

是否可以使用模块方法进行此转换,或者我在这里想错了?

我可以通过self从模块mehtod中访问该对象,但我似乎无法self.weekday

1 个答案:

答案 0 :(得分:1)

你要做的事当然是可能的。当您将ActiveRecord :: Inflector指向类似的方式时,您是正确的。这种方法修改Fixnum类本身以添加新方法,虽然我一般不建议对核心类进行临时修补,但您可以在active_support/core_ext/integer/inflections.rb中看到它的实际应用:

require 'active_support/inflector'

class Integer
  # Ordinalize turns a number into an ordinal string used to denote the
  # position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
  #
  #  1.ordinalize     # => "1st"
  #  2.ordinalize     # => "2nd"
  #  1002.ordinalize  # => "1002nd"
  #  1003.ordinalize  # => "1003rd"
  #  -11.ordinalize   # => "-11th"
  #  -1001.ordinalize # => "-1001st"
  #
  def ordinalize
    ActiveSupport::Inflector.ordinalize(self)
  end
end

在你的情况下,我可能会这样做:

module WeekdayInflector
  def weekday
    Date::DAYNAMES[self]
  end
end


class Fixnum
  include WeekdayInflector
end

这将至少帮助其他人通过查看模块来追踪您添加的方法。请注意,这将影响Fixnum的所有实例,并且如果您包含尝试执行相同操作的Gem,则可能会导致冲突。值得一提的是,这种权衡是否值得,或者如果定义一个简单的视图助手是更好的方法。