Open sclinede opened 11 years ago
можно DSL расширить, добавить параметр unique, туда передать параметры конструктора, аля resque-integration:
class OrderListsCSVReport < CSVReport
source :orders
unique { |date_from, date_to| [date_from, date_to] }
directory File.join(Rails.root, 'public/files/shared/tmp/order_lists_report')
csv_options :delimiter => ',' ....
encoding CP1251
table do |order|
column 'Дата КД', (DateTime.parse(order['created_at']).in_time_zone.strftime('%d.%m.%Y %H:%M') if order['created_at'])
...
column 'Ссылка', order['lead_url']
end
def city(order)
order['company_main_region_name']
end
def initialize(date_from, date_to)
...
end
def orders
...# запрос данных с использованием @date_from, @date_to
end
end
Тогда так
unique { [date_from, date_to] }
эм. ну если это блок, то там откуда даты возьмутся?
{ [date_from, date_to] }
или ты имел ввиду все же:
unique { |date_from, date_to| [date_from, date_to] }
чем вариант через конструктор не угодил?
мне кажется неочевидно
может тогда алиас какой-нибудь понятный сделать, вместо слова super
чет я устал и ничего особо не понимаю
Можешь делать через unique, но я бы не хотел каждый раз, используя твой DSL, дублировать список аргументов из конструктора в unique. Надо, чтобы по умолчанию какое-то поведение было. И это можно придумать и сделать без всяких там super.
О. нашел способ перехватить аргументы. Можно тогда все аргументы просто забирать и все, а если надо только выборочные использовать unique Т.е. по-умолчанию:
class OrderListsCSVReport < CSVReport
source :orders
directory File.join(Rails.root, 'public/files/shared/tmp/order_lists_report')
csv_options :delimiter => ',' ....
encoding CP1251
table do |order|
column 'Дата КД', (DateTime.parse(order['created_at']).in_time_zone.strftime('%d.%m.%Y %H:%M') if order['created_at'])
...
column 'Ссылка', order['lead_url']
end
def initialize(date_from, date_to)
...
end
def orders
...# запрос данных
end
end
а если есть лишние аргументы в конструкторе:
class OrderListsCSVReport < CSVReport
source :orders
unique :date_from, :date_to
directory File.join(Rails.root, 'public/files/shared/tmp/order_lists_report')
csv_options :delimiter => ',' ....
encoding CP1251
table do |order|
column 'Дата КД', (DateTime.parse(order['created_at']).in_time_zone.strftime('%d.%m.%Y %H:%M') if order['created_at'])
...
column 'Ссылка', order['lead_url']
end
def initialize(date_from, date_to, some_param)
...
end
def orders
...# запрос данных с использованием @date_from, @date_to
end
end
Появилась новая идея, а что если заменить source на report_of, вот так:
class OrderListsCSVReport < CSVReport
report_of :orders, for: [:date_from, :date_to]
directory File.join(Rails.root, 'public/files/shared/tmp/order_lists_report')
csv_options :delimiter => ',' ....
encoding CP1251
table do |order|
...
end
def initialize(date_from, date_to, some_param)
...
end
def orders
...# запрос данных
end
end
class ProductsCSVReport < CSVReport
report_of :products # for => [:company_id] - можно опускать, если совпадает с параметрами конструктора
directory File.join(Rails.root, 'public/files/shared/tmp/products_report')
csv_options :delimiter => ',' ....
encoding CP1251
table do |product|
...
end
def initialize(company_id)
...
end
def products
...# запрос данных
end
end
@sclinede Пора завязывать, это уже не конструктив, а какая-то муть выходит. Делай уже, в реквесте видно будет что плохого осталось
Сделал первый коммит. "Это" еще не работает, но можно посмотреть код. Надо еще дописать перехват аргументов конструктора. Еще не прописал зависимости и нет тестов.
@sclinede Лучше делай реквестами, смотреть будет проще имхо :)
Окей. На сегодня я все, а дальше буду в копию ставить к реквестам. Завтра буду тестировать.
Я бы рекомендовал посмотреть на
ок, посмотрю. а можно по-точнее про форматирование? просто мне уже замылил глаза код. Хотелось бы понять куда смотреть
Я только отдельное issue создам, там обсудим, ок ?
Вот пример существующего отчета "Лог заказов" в csv:
Хотелось бы достаточно просто формировать подобные отчеты, причем с возможностью выполнять формирование в фоне. На первый взгляд DSL для такой задачи видится следующим: