English 中文(简体)
包含数据库和非数据库数据源的Rails模型应该如何分解?
原标题:
  • 时间:2008-09-16 08:36:12
  •  标签:

所以我正在开发一个Rails应用程序,以获得对整个事情的感觉。我有一个Product模型,它是一个标准的ActiveRecord模型。然而,我也想从亚马逊云服务器上获得一些额外的产品信息。因此,我的完整模型的一些信息来自数据库,一些信息来自web服务。我的问题是,我应该:

  1. 将两个模型制作为一个Product和一个ProductAWS,然后在控制器级别将它们连接在一起。

  2. 产品ActiveRecord模型是否包含一个执行所有AWS功能的ProductAWS对象?

  3. 只需将所有AWS功能添加到我的产品模型中。

  4. ???

最佳回答

和大多数事情一样:这取决于情况。你的每一个想法都有价值。如果是我,我会这样开始:

  class Product < ActiveRecord::Base
     has_one :aws_item
  end 
  class AWSItem 
     belongs_to :product
  end

你想问自己的关键问题是:

您是只提供AWS ECS产品,还是会提供其他产品如果你的产品与亚马逊无关,不关心ASIN等,那么has_one可能是你的选择。或者,更好的是,与可销售接口的多态关系,这样您以后就可以插入不同的扩展类型。

是只是行为不同,还是数据也会有很大不同因为您可能需要考虑:

class Product < ActiveRecord::Base
end 
class AWSItem < Product
  def do_amazon_stuff
    ... 
  end
end

当亚马逊云服务器不可用时,您希望系统如何运行它应该抛出异常吗?还是应该依赖目录的本地缓存版本?

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中使用composed_of关系。您使用通过AWS管理的所有属性创建一个常规类,并指定您的Product类由该类组成。ActiveRecord将处理映射的属性到该类的委派和从该类的委托。

请参阅composed_of的文档

@门诺牌手表

使用AWS属性类的ActiveResource

如果您从两个完全不同的来源(一方面是ActiveRecord,另一方面是Internet)检索数据,那么将它们作为单独的模型保存有很多好处。正如上面的海报所写,产品has_one(或has_many):aws_item。





相关问题
热门标签