MongoMapper: составление нескольких наборов ключей и методов?

В MongoMapper классы могут наследовать ключи и методы от суперклассов. Здесь я написал код, включающий в себя целочисленный ключ "baz" и простой метод сортировки, чтобы установить значения baz своих экземпляров для последовательного подсчета чисел.

require 'mongo_mapper'
require './init/mongo_init' # Load database connection

class Sortable
    include MongoMapper::Document
    key :baz, Integer

    def self.sort_baz
        counter = 0
        Sortable.each do |record|
            record.baz = counter
            counter += 1
            record.save
        end
    end
end

class Model < Sortable
    include MongoMapper::Document
    key :foo, String
    key :bar, String
end

Model.delete_all
model1 = Model.new.save
model2 = Model.new.save
model3 = Model.new.save
Model.sort_baz
Model.all.each do |record|
    puts record.inspect
end

Вот результаты:

#<Model _id: BSON::ObjectId('525ecd73ab48655daa000001'), _type: "Model", baz: 0>
#<Model _id: BSON::ObjectId('525ecd73ab48655daa000002'), _type: "Model", baz: 1>
#<Model _id: BSON::ObjectId('525ecd73ab48655daa000003'), _type: "Model", baz: 2>

Вот мой вопрос: я пишу код с моделями, которые захотят наследовать несколько типов функций, что в Ruby предлагает использовать модули и включает, так как Ruby не поддерживает множественное наследование.

Но документы MongoMapper должны быть классами, а не модулями. Другими словами, это то, что я хотел бы сделать, но это не сработает:

module Sortable
    include MongoMapper::Document
    key :baz, Integer

    def self.sort_baz
        counter = 0
        self.each do |record|
            record.baz = counter
            counter += 1
            record.save
        end
    end
end

module OtherFunctionality
    include MongoMapper::Document
    key :bam, Integer
end

class Model
    include MongoMapper::Document
    key :foo, String
    key :bar, String
    include Sortable
    include OtherFunctionality
end

Есть ли способ аккуратно объединить несколько повторно используемых наборов ключей MongoMapper и методов класса в каждом конкретном случае?

1 ответ

Решение

Это сработало для меня - благодаря @muistooshort

module Sortable
    def self.included(base)

        base.class_exec do
            include MongoMapper::Document
            key :baz, Integer

            def self.sort_baz
                counter = 0
                self.each do |record|
                    record.baz = counter
                    counter += 1
                    record.save
                end
            end
        end

    end
end

class Model
    include MongoMapper::Document
    key :foo, String
    key :bar, String
    include Sortable
end
Другие вопросы по тегам