代码之家  ›  专栏  ›  技术社区  ›  bhollis

包含数据库和非数据库数据源的Rails模型应该如何分解?

  •  2
  • bhollis  · 技术社区  · 16 年前

    所以我正在开发一个Rails应用程序来了解整个事情。我有一个 Product 这是一个标准的ActiveRecord模型。但是,我还想从亚马逊ECS获取一些额外的产品信息。因此,我的完整模型从数据库和web服务中获取了一些信息。我的问题是,我是否应该:

    1. 将两个模型分别设置为Product和ProductAWS,然后在控制器级别将它们绑定在一起。

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

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

    4. ???

    4 回复  |  直到 16 年前
        1
  •  0
  •   Pete    16 年前

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

      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
    

    当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
    

    慢慢地走过这些问题,答案会变得更清楚。如果没有,就开始制作原型。祝你好运

        2
  •  0
  •   Menno    16 年前

    您可以使用 composed_of ActiveRecord中的关系。您使用通过AWS管理的所有属性创建一个常规类,并指定您的Product类是由该类组成的。ActiveRecord将处理映射属性与此类之间的委托。

    看见 the documentation of composed_of

        3
  •  0
  •   Hank Gay    16 年前

    @门诺

    使用怎么样 ActiveResource 对于AWS属性类?

        4
  •  0
  •   Jane Q Public    16 年前

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

    推荐文章