包含数据库和非数据库数据源的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。