2015-10-15 2 views
0

Я как бы сомневаюсь, что это возможно, но я решил, что попытаюсь посмотреть, сможет ли сообщество помочь мне придумать решение.Concat Integer & String, чтобы сформировать метод

В моем приложении пользователи могут создавать счет-фактуру, и я пытаюсь разрешить им создавать повторяющиеся счета-фактуры из формы, чтобы они могли выбирать число, интервал (год, месяц, день), а оттуда я иметь возможность получить интервал.

В идеале было бы сформировать что-то вроде этого: 1.year.from_now

, который дал бы мне дату, чтобы отправить следующий счет-фактуру. Это встроенный помощник rails, который я хотел бы сформировать, используя информацию из моей базы данных.

Итак, на Invoice.create Я проверяю, является ли это повторяющимся счетом, который будет превращен в шаблон (Recurringinvoice), и если он это я создаю его:

Recurringinvoice.create(customer_id: @customer.id, company_id: @company.id, 
invoice_number: @invoice.invoice_number, private_notes: @invoice.private_notes, 
customer_notes: @invoice.customer_notes, payment_terms: @invoice.payment_terms, 
status: "unpaid", discount: @invoice.discount, po_number: @invoice.po_number, 
interval: @invoice.interval, 
invoice_interval_number: @invoice.invoice_interval_number) 

То, что я хотел бы сделать: @ invoice.invoice_interval_number + "" + @ Invoice.interval + «.from_now»

Это дало бы мне 1.year.from_now или 2.days.from_now и т.д.

Есть в любом случае я могу сделать это случиться? Есть ли лучшее решение, о котором я не думаю?

ответ

1

В рубине вы можете использовать метод send для вызова метода по его названию.

  • @invoice.invoice_interval_number является Целочисленным.
  • @invoice.interval содержит имя метода, который вы хотите вызвать в Integer.
  • from_now - метод, который вы хотите вызвать по результату предыдущего метода.

Который дает нам:

@invoice.invoice_interval_number.send(@invoice.interval).from_now 

Документация: http://ruby-doc.org/core-2.2.3/Object.html#method-i-send

+0

Красивая. Он отлично работает, и я никогда об этом не знал. –

+0

Это часть возможностей метапрограммирования Ruby. Что удивительно :) – Caillou