как иметь отдельные ключи для каждой записи в mongo_mapper + Rails - PullRequest
2 голосов
/ 21 мая 2010

Когда я добавляю запись в mongodb, я могу указать любые ключи, которые мне нужны, и они будут сохранены в БД. Проблема в том, что он запомнит эти ключи, когда в следующий раз я вставлю другую запись. так, например, если я сделаю следующее:

Product.create :foo => 123

, а затем

Product.create :bar => 456

Я получаю поле :foo => nil во 2-й записи.

Это определенно не является ограничением для самого mongodb, поскольку, если я перезапущу консоль rails и создам еще одну запись с другим набором столбцов, он не добавит столбцы из первых 1 записей.

Похоже, что mongomapper запоминает все используемые ключи и вставляет их все в все записи, даже если значения не указаны.

Вопрос, очевидно, как отключить этот безумный взрыв атрибутов?

По сути, я хочу, чтобы только «постоянные» ключи, которые я указываю в модели, были в каждой записи, но все «дополнительные» атрибуты должны быть указаны для каждой записи, чтобы не мешать последующим записям.

1 Ответ

1 голос
/ 16 июля 2010

Когда вы пишете в ключ, MongoMapper будет гарантировать, что они определяют ключ в документе (как если бы вы объявили его сами с помощью метода класса key).Посмотрите этот код здесь:

http://github.com/jnunemaker/mongomapper/blob/master/lib/mongo_mapper/plugins/keys.rb#L237

Я не думаю, что MongoMapper может каким-либо образом отличить ключи, которые вы объявили в классе, от ключей, которые он создает динамически.* Тем не менее, вы всегда можете сделать свои собственные "reset_keys!"метод, который уничтожит переменную @keys в вашем классе и перестроит ее снова.Это грубо и хрупко, так как мы нарушаем инкапсуляцию.Вот как это может выглядеть!

class Product
  include MongoMapper::Document

  def self.reset_keys!
    @keys = nil
    key :_id, ObjectId
    key :permanent_biz
    key :permanent_buz
  end

  reset_keys!
end

Product.create :foo => 123
Product.reset_keys!
Product.create :bar => 456

Я не проверял это, но что может пойти не так?

...