#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 . он выдает исключения, говорящие, что я не могу получить доступ к классу напрямую и должен использовать коллекцию.