为什么DataMapper使用mixins和继承?

clo*_*ead 5 ruby inheritance ruby-on-rails datamapper mixins

所以我只是好奇这个:

DataMapper为其模型使用mixin

class Post
  include DataMapper::Resource
Run Code Online (Sandbox Code Playgroud)

而active-record使用继承

class Post < ActiveRecord::Base
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么DataMapper选择这样做(或者为什么AR选择不这样做)?

Mic*_*aer 5

它允许您从另一个不是DM类的类继承.

它还允许动态添加DM功能.这是我正在处理的模块的类方法:

def datamapper_class
  klass = self.dup
  klass.send(:include, DataMapper::Resource)
  klass.storage_names[:default] = @table_name
  klass.property(:id, DataMapper::Types::Serial)
  klass.property(:created_at, DateTime, :nullable => false)
  klass.property(:updated_at, DateTime, :nullable => false)
  columns_with_types { |n, t| klass.property(n, t, :field => n.to_s) }
  klass
end
Run Code Online (Sandbox Code Playgroud)

这让我可以使用SAXMachine类(非常轻量级)并将其转换为Datamapper类,并使用它来执行DataMappery.你甚至可以将它转换为对象的单例类.

我想,当我从XML导入100K对象时,这会降低我的内存占用量(我不使用DM进行大量导入),只在我需要它时混合使用更复杂的数据库函数


Ben*_*hes 3

我认为这个想法是 ActiveRecord 将数据库支持的方面视为模型类的关键功能,因此它继承了该行为。DataMapper 看起来似乎认为数据库支持只是可以添加到类中的类的一个方面。

这是我的猜测。耶胡达·卡茨可以明确地告诉你。