2010-12-04 122 views
0

我有一個Rails應用程序,用作混合數據的接口。我需要的大部分信息都是使用XML-RPC從命令行程序中檢索的。除此之外,我還需要一些額外的數據,我除了存儲在數據庫中別無選擇。出於這個原因,我很難弄清楚什麼是設計應用程序的最佳方式。Rails應用程序接口體系結構設計

我已經覆蓋self.allself.find(id)使得它們依賴於調用super,然後通過定義實例變量,從使用XML-RPC程序檢索相應的數據「充實」的對象。

雖然這一切似乎相當複雜。例如,我想我已經失去了使用魔法發現器的能力(find_by_x),並且我不知道是否有其他任何事情會因此而中斷。

我的問題是如果有一個更合乎邏輯和明智的方式去做這件事。也就是說,設計一個大部分依賴於XML-RPC數據的應用程序,還有一些存儲在數據庫中的數據。我已閱讀after_find。使用這個回調函數,我可以實現「對象豐富化」過程,並在發現記錄時隨時運行它。但是,我檢索與某個項目相關的數據的方法與檢索全部項目數據的方法不同。我這樣做檢索所有項目數據(self.all)是更有效的,但不幸的是不適用,只檢索一個項目的數據(self.find)。如果有方法可以使回調不適用於self.all調用,這將工作得很好。

+1

謙虛的建議。請簡明扼要。 – Shreyas 2010-12-04 11:49:08

+0

謙虛地注意到:) – 2010-12-05 01:18:21

回答

2

根據我的經驗,你不應該混淆ActiveRecord的發現者 - 他們依賴的魔法有很多

after_find是一個大的方向入手,但如果你遇到與配料的問題,那麼我建議你是雙重的 - 使用一個緩存層和alias_method_chain實現一個版本的#all執行你的批處理XML的RPC查找,緩存它,然後將該呼叫傳遞給未解析的原始all。然後,您的after_find會首先檢查您的緩存中的數據,如果不存在,請執行遠程查找。這可以讓您在使用回調時成功批量找到all的數據。

也就是說,可能有更簡單的方法來做到這一點。我只是使用不是從ActiveRecord::Base下降的模型,而是從某個XMLRPC基礎接口下降的模型,然後在它們之間建立人造關聯,這些關聯指向包含數據庫信息的AR實例。因此,你可能會碰到這樣的:

class XmlRpcModelBase 
    ... 

    def find(...) 
    end 

    def all(...) 
    end 

    def extra_data 
    @extra_data ||= SomeActiveRecordModel.find(...) 
    end 
end 

class Foo < XmlRpcModelBase 

end 

它的效果並不理想,而且坦率地說,這將取決於有多少這樣讀了很多,又有多少是讀/寫,但我會盡量留在可能的情況下脫離ActiveRecord的方式,而是根據需要安裝AR相關部分。