2011-06-03 76 views
9

我有一個情況我需要調用是這樣結尾的方法:如何編寫與關鍵字

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 

我應該怎麼修改以上工作人員方法才能實現上述代碼。

+0

你在使用框架嗎?例如Rails的? – Ant 2011-06-03 10:55:49

+2

@Ant:我沒有使用軌道它的寶石 – 2011-06-03 10:57:11

+0

我已根據您的新信息更新了我的答案。 – 2011-06-03 12:15:58

回答

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是如何實現的,因爲它做的事情非常相似。

+2

@Jits:但是我如何訪問WorkersClient類中的office對象的ID? – 2011-06-03 12:09:36

+0

@ManishDas,答案已更新。 – Jits 2011-06-03 12:12:41

+0

有趣的想法,但這不適用於'office.workers << worker'。 – 2011-06-03 12:21:37

3

試試這個office.build_worker

+2

@sadikha:我必須在寶石上實現,所以沒有數據庫的東西..任何想法如何做到這一點? – 2011-06-03 10:58:37

+0

@mark:你應該看到這個http://meta.stackexchange.com/questions/82003/how-to-see-who-updownvoted沒有難過的感覺:) – 2011-06-05 16:10:52

0

如果這些對象實際上ActiveRecord對象(這有點聽起來像),你可能看

office.workers << new_worker 

注意複數形式。

如果這些對象是您自己的創作,你可能想辦#工人返回Array'ish對象,所以像

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

添加完整性檢查和諸如此類的東西,你認爲合適。

+2

我可以這樣做: – 2011-06-03 11:01:16

+2

def workers <<工作人員...... – 2011-06-03 11:01:46

+0

闡明瞭代碼示例,以便明確表示工作人員方法應該在Office類中。 – 2011-06-03 11:06:21

0

對已經說過的內容沒有太多補充,但有一點需要考慮的是隱藏workers的實現。當然,它從一個數組開始,但可能會改變。通過實施您自己的<<方法,您可以隱藏用戶的實施細節。

class Office 
    attr_accessor :workers 

    def initialize 
    @workers = [] 
    end 

    def <<(other) 
    self.workers << other 
    end 
end 

我傾向於使用getter/setter方法我的課裏面的這件事情,我從Smalltalk的書本上學,當然你可能只是做@workers << other

(基於更新的問題)這個