В рельсах 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
Мне просто интересно:
- встроенные решения этой проблемы уже существуют?
- У моей реализации есть недостатки, которые я не вижу?