В рельсах 3.2+ вы можете сделать это:
SomeModel.some_scope.first_or_initialize
Что вы также можете сделать:
OtherModel.some_models.first_or_initialize
Я нахожу это довольно полезным, но мне бы хотелось иметь метод first_or_build в моих ассоциациях has_many, который будет действовать как first_or_initialize, но также добавит новую запись в ассоциацию как build, когда необходимо.
обновление для уточнения: да, я знаю о first_or_initialize и first_or_create. Thing is, first_or_initialize не добавляет инициализированную запись в цель ассоциации как build, а first_or_create... ну... создает запись, которая не является целью.
У меня есть решение, которое работает, используя расширения расширений:
class OtherModel < ActiveRecord::Base
has_many :some_models do
def first_or_build( attributes = {}, options = {}, &block )
object = first_or_initialize( attributes, options, &block )
proxy_association.add_to_target( object ) if object.new_record?
object
end
end
end
Мне просто интересно:
- встроенные решения этой проблемы уже существуют?
- У моей реализации есть недостатки, которые я не вижу?