2017-01-21 2 views
0

Мне было интересно, как часто выбирать записи в инициализаторе?Рельсы; Захват записей в инициализаторе

Здесь приведен пример использования объекта службы для извлечения записей и созданного файла приема PDF.

Вклад - это счет-фактура uuid, а также получить связанные записи, такие как подробные сведения о карте, счета-фактуры в пределах начального.

class Pdf::GenerateReceipt 
     include Service 

     attr_reader :invoice, :items, :card_detail 

     def initialize(invoice_uuid) 
     @invoice ||= find_invoice!(invoice_uuid) # caching 
     @items = invoice.invoice_items 
     @card_detail = card_detail 
     end 
     ..... 

     def call 
     return ReceiptGenerator.new(
      id: invoice.uuid, # required 
      outline: outline, # required 
      line_items: line_items, # required 
      customer_info: customer_info 
     ) 
     rescue => e 
     false, e 
     end 

    ..... 

     def card_detail 
     card_metadata = Account.find(user_detail[:id]).credit_cards.primary.last 

     card_detail = {} 
     card_detail[:number] = card_metadata.blurred_number 
     card_detail[:brand] = card_metadata.brand 
     card_detail 
     end 
    end 

Pdf::GenerateReceipt.('28ed7bb1-4a3f-4180-89a3-51cb3e621491') # => then generate pdf 

Проблема в том, что записи не найдены, это порождает ошибку. Я мог бы спастись в инициализаторе, однако это кажется не распространенным.

Как я могу обойти это более рубиновым способом?

ответ

1

Это в основном мнение и анекдот, но я предпочитаю иметь дело с тем, чтобы отличать мои ценности как можно дальше от цепочки. Поэтому я бы нашел счет перед этим объектом и передал его в качестве аргумента, то же самое с card_detail.

Если вы сделаете это в этом классе, это ограничит ответственность за координацию этих двух объектов, что легче проверить, а также добавит еще один уровень, о котором вы должны рассуждать в будущем.

Так как я бы обрабатывать, разделить это на 4 отдельные вещи

  1. Счет Finder вещь
  2. Card Finder вещь
  3. Pdf Генератор, который принимает счета-фактуры и карты в качестве аргументов

  4. Наконец , что-то организовать 3 действия выше

Надеюсь, это поможет.

Дополнение: Проверьте книгу уверенным рубином avdi grimm. Это отлично подходит для описания этого типа сценария.

+0

Спасибо! Я согласен, и у меня есть книга уже, но еще не так много читала. Я выяснил, почему я это сделал, потому что я асинхронно генерирую и отправляю квитанцию, поэтому, возможно, кредитная карта изменена сразу после помещения в очередь, это может быть проблемой. – Tosh

Смежные вопросы