ActiveRecord:模型的不同表示

时间:2014-10-06 09:07:32

标签: ruby-on-rails inheritance activerecord mixins

我有一个名为Book的模型,它代表一本包含所有可用数据的书。我现在需要针对几种情况的书籍实例专门化(仅举例):

  • AmazonBook的id为asin(亚马逊标准识别号码)或isbn(取决于哪个可用,asin是首选)。它还有一个特定的csv版本的书籍记录。 "特殊属性" asin包含在基本的书籍记录中。
  • 其他市场上的书籍需要其他(虚拟?)属性,例如,对Booklooker-marketplace的csv-export具有不同的结构,或者Booklooker-Marketplace具有自己的"特殊属性"。这些特殊属性都存储在基本书籍记录

专用实例始终引用数据库中的相同书籍记录,例如记录具有asin和特殊的booklooker属性或其他。为了速度,我这样做了,以避免连接操作(数据库中大约200000条记录)。

实施此方法的正确方法是什么?继承(AmazonBook< Book,BooklookerBook< Book,...)或非ActiveRecord类,带有获取图书实例的初始化程序)或...... ??

我想让我的代码更有条理,目前我有一个胖模型类,有amazon_id,amazon_csv,other_id,other_csv等方法...... 我希望有一个像@ book.amazon.to_csv或@ book.booklooker.csv这样的访问器来访问同一视图中的不同表示。实际上是同一本书的两个不同的实例@amazon_book和@booklooker_book不是我认为的方式......

也许有一种api是解决方案?或者一种"方法命名空间"?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用has_one关系创建许多与Book相关的模型。

Amazon_Book 
  belongs_to :book

Booklover_Book
  belongs_to :book

Book
  has_one :amazon_book
  has_one :booklover_book

然后您想要的访问者将工作

book = Book.find(...)
book.amazon_book.asin 
book.booklover_book.whatever 

您可以添加,修改和删除特定于市场的模型,而不会影响整个图书模型或彼此。