Возможно, вы захотите взглянуть на плагин and на http://github.com/raganwald/andand.
По сути, он обрабатывает ошибки, которые могут возникнуть при попытке вызвать метод для другого, который может быть nil .
Основано исключительно на вашем примере:
Product.find_by_id(self.product_id).name #=> complains that 'name' is being called on nil
Реализация andand будет выглядеть так:
Product.find(self.product_id).andand.name
И даже если первый оператор Product.find (self.product_id) вернет nil , он больше не вызовет неопределенный метод при ошибке nil.
PS:
Опять же, основываясь только на вашем коде, я вижу, что вы воспроизводите функциональность, сгенерированную с помощью ассоциации: own_to. По сути, это означает, что вы можете использовать:
self.product
Внутренняя часть:
Product.find_by_id(self.product_id)