полиморфный .find_or_create_by с mongoid 2.0.1, для встроенных коллекций документов? - PullRequest
2 голосов
/ 07 мая 2011

в предыдущем выпуске Mongoid (2.0.beta.20) я мог передать тип класса как 2-й параметр блока .find_or_create_by во встроенных коллекциях документов.Похоже, что это больше не так, с v2.0.1, но мне все еще нужно сделать полиморфный find_or_create_by.какие-либо предложения / указатели о том, как это сделать?

Я раньше делал это:

SomeClass.childclass.find_or_create_by({:key => "value"}, InheritingChildClass)

Теперь я получаю исключение, говорящее слишком много аргументов (2 для 1) .find_or_create_by.

как я могу сказать коллекции создать объект правильного типа при использовании find_or_create_by?Или, как я могу создать свой собственный метод, который будет функционально эквивалентен тому, что я хочу, и будет многократно использоваться в моих встроенных коллекциях документов?

любая помощь приветствуется.

спасибо.

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Я закончил тем, что катил свое собственное решение для этого

module Mongoid::Relations
  class Many
    def find_or_new(attrs, type, &block)
      inst = self.where(attrs).first

      unless inst
        inst = type.new
        inst.write_attributes attrs
        self << inst
      end

      inst
    end
  end
end
0 голосов
/ 07 мая 2011

Не уверен, что я действительно понял, что вам нужно сообщить подклассу, но проверьте эту суть: https://gist.github.com/960684

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

...