0

我有一个 Rails 应用程序,用作数据混合的接口。我需要的大部分信息都是从使用 XML-RPC 的命令行程序中检索到的。除此之外,我需要一些额外的数据,我别无选择,只能存储在数据库中。出于这个原因,我很难弄清楚设计应用程序的最佳方法是什么。

我已经重写了self.all并且self.find(id)它们依赖于对对象的调用super,然后通过将其实例变量定义为使用 XML-RPC 从程序中检索到的适当数据来“丰富”该对象。

不过,这一切似乎都很令人费解。例如,我想我已经失去了使用魔法探测器 ( find_by_x) 的能力,我不知道是否会因此而破坏其他任何东西。

我的问题是,是否有一种更合乎逻辑和更明智的方式来做这件事。也就是说,设计一个应用程序,它的数据大部分依赖于 XML-RPC,但也有一些数据存储在数据库中。

我确实读过关于after_find. 使用这个回调,我可以实现“对象丰富”过程,并让它在找到记录的任何时候运行。但是,我检索与项目关联的数据的方法与检索所有项目数据的方法不同。我检索所有项目数据self.all方式(如果有一种方法可以使回调不适用于调用,这将很有效。self.findself.all

4

1 回答 1

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-必要时相关的部分。

于 2010-12-05T01:33:46.820 回答