Ассоциации «многие к одному» в MongoMapper

Есть ли способ использовать плагин associations в MongoMapper для создания связи «многие к одному» между классами? Вот моя попытка.

class Foo
    include MongoMapper::Document
end

class Bar
    include MongoMapper::Document

    key :foo_id, ObjectId
    one :foo, :in => :foo_id
end

Эта реализация не работает, потому что метод one предполагает ассоциацию один к одному и позволяет только одному экземпляру Bar содержать идентификатор конкретного Foo.

foo = Foo.new

bar1 = Bar.new
bar1.foo = foo

bar2 = Bar.new
bar2.foo = foo

bar1.foo #=> nil :(

Я не хотел бы создавать ассоциацию «один ко многим» в классе Foo, потому что он не должен знать Bar.

Простое сохранение foo_id возможно, но метод Bar#foo действительно полезен.


person Vortico    schedule 19.02.2013    source источник


Ответы (1)


Я искал ответ на этот вопрос, но не мог найти ничего определенного. В итоге я добавил в свою модель метод для запуска ручного соединения. Вот как будет выглядеть код в вашем примере:

class Foo
    include MongoMapper::Document
end

class Bar
    include MongoMapper::Document

    key :foo_id, ObjectId

    def foo
        Foo.find(foo_id)
    end

    def foo=(a_foo)
        foo_id = a_foo.id
    end

    def serializable_hash(options = {})
        hash = super(options)
        hash.merge({'foo' => foo.serializable_hash})
    end

end

foo = Foo.new

bar1 = Bar.new
bar1.foo = foo

bar2 = Bar.new
bar2.foo = foo

bar1.foo # Should return expected value
person John Jacquay    schedule 12.02.2014
comment
Я больше не использую MongoDB, но этот ответ прост, и, хотя он не очень элегантный, он может быть кому-то полезен. - person Vortico; 13.02.2014