包含数据库和非数据库数据源的Rails模型应该如何分解?
时间:2020-03-05 18:55:24 来源:igfitidea点击:
因此,我正在开发一个Rails应用程序,以了解整个过程。我有一个"产品"模型,它是标准的ActiveRecord模型。但是,我也想从Amazon ECS获得一些其他产品信息。因此,我的完整模型从数据库中获取一些信息,并从Web服务中获取一些信息。我的问题是,我应该:
- 将两个模型制作为Product和ProductAWS,然后在控制器级别将它们绑定在一起。
- 产品ActiveRecord模型是否包含一个可以完成所有AWS工作的ProductAWS对象?
- 只需将所有AWS功能添加到我的产品模型中即可。
- ???
解决方案
回答
我们可以在ActiveRecord中使用composed_of
关系。我们可以创建一个具有通过AWS管理的所有属性的常规类,并指定Product-class是此类的composition_。 ActiveRecord将处理与此类之间的映射属性的委派。
参见composed_of的文档
回答
@门诺
将ActiveResource用于AWS-attributes类怎么办?
回答
与大多数情况一样:这要视情况而定。每个想法都有优点。如果是我,我将以这种方式开始:
class Product < ActiveRecord::Base has_one :aws_item end class AWSItem belongs_to :product end
我们想问自己的关键问题是:
我们是只提供AWS ECS项目,还是会有其他产品?如果我们将拥有与亚马逊无关的产品,不关心ASIN等,那么has_one可能是理想之选。或者,甚至更好的是,与:vendable接口具有多态关系,因此我们以后可以插入不同的扩展类型。
仅仅是行为不同,还是数据也将大不相同?因为我们可能要考虑:
class Product < ActiveRecord::Base end class AWSItem < Product def do_amazon_stuff ... end end
当Amazon ECS不可用时,我们希望系统如何执行?它应该抛出异常吗?还是应该依靠目录的本地缓存版本?
class Product < ActiveRecord::Base end class ItemFetcher < BackgrounDRb::Rails def do_work # .... Make a cached copy of your ECS catalog here. # Copy the Amazon stuff into your local model end end
慢慢浏览这些问题,答案将变得更加清晰。如果不是,请开始制作原型。祝你好运!
回答
如果要从两个完全不同的源(一方面是ActiveRecord,另一方面是Internet)中检索数据,则将它们保留为单独的模型有很多好处。如上面的海报所述,产品has_one(或者has_many):aws_item。