Основное отличие состоит в том, что в DataMapper модель определяется в самом классе ruby:
class Post
include DataMapper::Resource
property :id, Serial
property :title, String
property :body, Text
property :created_at, DateTime
end
В то время как в ActiveRecord класс в основном пустой класс, фреймворк сканирует базу данных. Это означает, что вам нужна либо заранее определенная база данных, либо использовать что-то вроде миграции для генерации схемы, это держит модель данных отделенной от ORM.
DataMapper.auto_migrate!
сгенерирует схему для вас.
ActiveRecord отличается в этом отношении:
class Post < ActiveRecord::Base
end
В DataMapper нет необходимости в миграциях, поскольку автомиграции могут генерировать схему или искать различия между моделью и базой данных и выполнять миграцию за вас. Существует также поддержка ручной миграции, которую вы можете использовать для нетривиальных случаев.
Кроме того, DataMapper гораздо более дружественен к синтаксису «ruby», и такие функции, как отложенная загрузка при выполнении условий с цепочкой (например, ActiveRecord в Rails 3), присутствуют с самого начала.
Datamapper также имеет функцию, заключающуюся в том, что каждая запись в базе данных отображается на один объект ruby, что неверно для ActiveRecord. Поэтому, если вы знаете, что записи в базе данных совпадают, вы знаете, что две ссылки на объект ruby также будут указывать на один и тот же объект.
С другой стороны, в то время как Rails 3 может пообещать вам сменные платформы, Datamapper railtie (dm-rails) не готов к работе, и многие функции могут не работать.
См. страницу для получения дополнительной информации.