2008-09-16 50 views
2

所以我正在开发一个Rails应用程序来获得整个事物的感觉。我有一个Product模型,它是一个标准的ActiveRecord模型。不过,我也想从Amazon ECS获得一些其他产品信息。所以我的完整模型从数据库获取一些信息,并从Web服务获取一些信息。我的问题是,我应该:应该如何分解包含数据库和非数据库数据源的Rails模型?

  1. 让两个型号的产品和ProductAWS,然后在控制器级别一起配合他们。

  2. 产品ActiveRecord模型是否包含可执行所有AWS工作的ProductAWS对象?

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

  4. ???

回答

0

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

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 

你怎么想执行时,亚马逊的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 

通过这些问题,慢慢地走,答案将变得更加清晰。如果没有,请开始原型设计。祝你好运!

0

您可以使用ActiveRecord中的composed_of关系。您使用AWS管理的所有属性创建常规班级,并指定您的产品级别由此类别组成。 ActiveRecord将处理映射到该类的属性的委托。

the documentation of composed_of

0

@Menno

怎么样使用ActiveResource为AWS-属性类?

+0

那么,我已经有一个客户端库。 – bhollis 2008-09-18 06:39:12

0

如果您从两个完全不同的来源(ActiveRecord和另一个互联网)检索数据,将这些数据保存为单独的模型有很多好处。正如上面的海报写的,Product has_one(或has_many):aws_item。