Вот как я это делаю. Не уверен, насколько это стандартно, но он работает очень хорошо и ленив в том, что он не создает дополнительных накладных расходов, если только это не необходимо для создания новой ассоциации (я рад, что исправлю это):
def profile_with_auto_build
build_profile unless profile_without_auto_build
profile_without_auto_build
end
alias_method_chain :profile, :auto_build
Это также означает, что ассоциация существует, как только вам это нужно. Я предполагаю, что альтернативой является использование after_initialize, но это, похоже, добавляет немного накладных расходов, так как он запускается каждый раз, когда объект инициализируется, и могут быть ситуации, когда вам не нужен доступ к ассоциации. Похоже, это пустая трата проверить его существование.