2010-12-04 119 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相关部分。