我有一种情况需要调用这样的东西:
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
。