我有一种情况需要调用这样的东西:
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方法以实现上述代码。
答案 0 :(得分:4)
对此的新答案(基于更新的问题):
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是如何实现的,因为它做了非常相似的事情。
答案 1 :(得分:3)
试试这个office.build_worker
答案 2 :(得分:0)
如果这些对象实际上是ActiveRecord对象(听起来很像),你可能会看到
office.workers << new_worker
请注意复数形式。
如果这些对象是您自己的创建,您可能希望Office#worker返回一个Array'ish对象,所以类似
class Office
def workers
@workers ||= []
end
end
添加健全性检查以及您认为合适的内容。
答案 3 :(得分:0)
添加到已经说过的内容并不多,但要考虑的一件事是隐藏workers
的实现。当然,它从阵列开始,但可能会改变。通过实施您自己的<<
方法,您可以隐藏用户的实施细节。
class Office
attr_accessor :workers
def initialize
@workers = []
end
def <<(other)
self.workers << other
end
end
我倾向于在课堂上使用getter / setter,因为这是我从Smalltalk书籍中学到的东西,但当然你可以@workers << other
。