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