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

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

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

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

    1. 使两个模型成为一个产品和一个产品,然后在控制器级别将它们连接在一起。

    2. product activerecord模型是否包含一个product aws对象来执行所有的aws操作?

    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管理的所有属性创建一个常规类,并指定您的产品类由这个类组成。ActiveRecord将处理与此类之间映射属性的委托。

    the documentation of composed_of

        3
  •  0
  •   Hank Gay    16 年前

    @门诺

    用什么呢 ActiveResource 对于AWS属性类?

        4
  •  0
  •   Jane Q Public    16 年前

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