1

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 キーとクラスメソッドの複数の再利用可能なセットをきれいに組み合わせる方法はありますか?

4

1 に答える 1

3

これは私にとってはうまくいきました– @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
于 2013-10-16T21:09:06.583 に答える