полиморфный .find_or_create_by с mongoid 2.0.1 для встроенных коллекций документов?

#ruby-on-rails #ruby-on-rails-3 #inheritance #polymorphism #mongoid

#ruby-on-rails #ruby-on-rails-3 #наследование #полиморфизм #mongoid

Вопрос:

в предыдущей версии Mongoid (2.0.beta.20) я мог передать тип класса в качестве второго параметра блока .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? Или, как я могу создать свой собственный метод, который будет функционально эквивалентен тому, что я хочу, и может быть повторно использован в моих встроенных коллекциях документов?

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

Спасибо.

Ответ №1:

В итоге я разработал собственное решение для этого

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

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

      inst
    end
  end
end
  

Ответ №2:

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

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

Комментарии:

1. хммм, теперь я понимаю ‘- — .. если вы хотите что-то вроде Person.find_or_create_by для создания экземпляра подкласса, это может быть проблемой.

2. да. также — кажется, я не могу вызвать InheritingChildClass.find_or_create_by . он выдает исключения, говорящие, что я не могу получить доступ к классу напрямую и должен использовать коллекцию.