如何使用关键字编写尾随方法

时间:2011-06-03 10:43:48

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems

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

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方法以实现上述代码。

4 个答案:

答案 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