2

我刚刚在ruby​​-trello中看到了这行 Ruby 代码:

# Returns the member who created the action.
one :member_creator, :via => Member, :using => :member_creator_id

它似乎与定义为的超类方法有关:

def self.one(name, opts = {})
  class_eval do
    define_method(:"#{name}") do |*args|
      options = opts.dup
      klass   = options.delete(:via) || Trello.const_get(name.to_s.camelize)
      ident   = options.delete(:using) || :id
      klass.find(self.send(ident))
    end
  end
end

我知道class_eval与反射有关。

有人可以解释子类代码行的目的吗?

我的猜测是它调用类成员作为名称one传递:member_creator,两个尾随参数作为opts参数。但是为什么要在类级别调用呢?

4

1 回答 1

2

这似乎是一种干燥一些用于通过主键查找单个记录的代码的方法。

您基本上传递了一个类/模型名称和一个用于获取主键的方法。

这段代码:

one :member_creator, :via => Member, :using => :member_creator_id

创建此方法:

def member_creator 
  Member.find(self.member_creator_id)
end
于 2012-12-03T16:46:50.327 回答