ruby on rails-如何编写一个以关键字结尾的方法



我有一种情况需要调用这样的东西:

class Office
   attr_accessor :workers, :id
   def initialize
      @workers = []
   end
   def workers<<(worker)
      type = worker.type
      resp = Organiation::Worker.post("/office/#{@id}/workers.json", :worker => {:type => type})
   end
end

这是我需要打电话给的地方

office = Office.new()
new_worker = Worker.new()
office.workers << new_worker

我应该如何修改上面的worker方法才能实现上面的代码。

这个问题的新答案(基于更新的问题):

class WorkersClient
  attr_accessor :office_id
  def <<(worker)
    type = worker.type
    resp = Organiation::Worker.post("/office/#{@office_id}/workers.json", :worker => {:type => type})
  end
end
class Office
  attr_accessor :workers, :id
  def initialize
    @workers = WorkersClient.new
    @workers.office_id = @id
  end
end

我假设Worker类是在某个地方定义的,类似于:

def Worker
  attr_accessor :type
  ...
end

WorkersClient类只是处理集合的代理(就像ActiveRecord 3处理关联一样)。您可以进一步开发它来存储本地缓存的工作者,等等

我建议看看Rails的ActiveResource是如何实现的,因为它做了一些非常类似的事情。

尝试此office.build_worker

如果这些对象实际上是ActiveRecord对象(听起来有点像),那么您可能正在查看

office.workers << new_worker

注意复数形式。

如果这些对象是你自己创建的,你可能希望Office#工作人员返回一个Array'ish对象,所以类似的东西

class Office
  def workers
    @workers ||= []
  end
end

添加健全性检查和其他你认为合适的内容。

前面没有太多要补充的内容,但需要考虑的一点是隐藏workers的实现。当然,它从一个数组开始,但这可能会改变。通过实现您自己的<<方法,您可以向用户隐藏实现细节。

class Office
  attr_accessor :workers
  def initialize
    @workers = []
  end
  def <<(other)
    self.workers << other
  end
end

我倾向于在课堂上使用getter/setter,因为这是我从Smalltalk的书中学到的,但当然你可以只做@workers << other

相关内容

  • 没有找到相关文章

最新更新