Ruby on rails 在rails 5中,我如何使代码干涸,以便从我的动作控制器和应用程序记录中导出不同的CSV?
我有一个应用程序,其唯一目的是种子数据文件和添加数据到不同的CSV是压缩和导出的用户。我的应用程序控制器中充满了这样的行:Ruby on rails 在rails 5中,我如何使代码干涸,以便从我的动作控制器和应用程序记录中导出不同的CSV?,ruby-on-rails,ruby-on-rails-5,dry,Ruby On Rails,Ruby On Rails 5,Dry,我有一个应用程序,其唯一目的是种子数据文件和添加数据到不同的CSV是压缩和导出的用户。我的应用程序控制器中充满了这样的行: def export_tips @appointments = Appointment.order('service_id') send_data @appointments.to_csv_tips, filename: 'tips.csv' end def export_ticketpayments @appointments = A
def export_tips
@appointments = Appointment.order('service_id')
send_data @appointments.to_csv_tips, filename: 'tips.csv'
end
def export_ticketpayments
@appointments = Appointment.order('service_id')
send_data @appointments.to_csv_ticketpayments, filename: 'ticketspaymentitems.csv'
end
def export_batchmanifest
@batchmanifests = Batchmanifest.all
send_data @batchmanifests.to_csv_batchmanifest, filename: "batch_manifest-#{Date.today}.csv"
end
def export_pets
@clients = Client.all
send_data @clients.to_csv_pets, filename: 'pets.csv'
end
def export_clients
@clients = Client.all
send_data @clients.to_csv_clients, filename: 'clients.csv'
end
我把它放在应用程序控制器中,因为我在多个不同的领域使用它,包括创建单个CSV导出和创建包含多个zip和CSV的复杂zip文件
我尝试清理代码的一些内容包括:
- 这方面的不同变量: def csv_导出(型号、文件名) @model.pluralize=(model.titleize).全部 发送_data@model.pluralize.filename,文件名:filename 结束
- 每个控制器都有自己的控制器(无法从不同的视图和其他控制器轻松访问它们)
- 我还试图弄清楚如何创建自己的模块,但无法做到这一点
def self.to_csv_appointments
attributes = %w[appointment_id location_id employee_id client_id child_id notes
has_specific_employee start_time end_time]
CSV.generate(headers: true) do |csv|
csv << attributes
all.each do |appointment|
csv << attributes.map { |attr| appointment.send(attr) }
end
end
end
def self.to_csv_appointmentservices
attributes = %w[appointment_id service_id price duration]
CSV.generate(headers: true) do |csv|
csv << attributes
all.each do |appointment|
csv << attributes.map { |attr| appointment.send(attr) }
end
end
end
def self.to_csv_tickets
attributes = %w[ticket_id location_id client_id ticket_status employee_id
employee_id start_time]
headers = %w[ticket_id location_id client_id status employee_id
closed_by_employee_id closed_at]
CSV.generate(headers: true) do |csv|
csv << headers
all.each do |appointment|
csv << attributes.map { |attr| appointment.send(attr) }
end
end
end
def self.to_csv_约会
属性=%w[约会\u id位置\u id员工\u id客户\u id子女\u id注释]
是否有\u特定\u员工开始\u时间结束\u时间]
CSV.generate(标题:true)do | CSV|
csv最后,我使用元编程来清理这个问题。以下是一个示例,为了简洁起见,我从数组中排除了一些项:
["bundle", "attendee", "location", "membership", "client", "staff"].each do |new_method|
define_method("#{new_method.pluralize}") do
instance_variable_set("@#{new_method.pluralize}", new_method.camelcase.constantize.all)
instance_var = instance_variable_get("@#{new_method.pluralize}")
send_data instance_var.public_send("to_csv_#{new_method.pluralize}"), filename: "#{new_method.pluralize}.csv"
end
end
我能够从新创建的导出控制器中删除30个方法。这是推高更改后的代码当人们回来回答自己的问题时总是很好+1
["bundle", "attendee", "location", "membership", "client", "staff"].each do |new_method|
define_method("#{new_method.pluralize}") do
instance_variable_set("@#{new_method.pluralize}", new_method.camelcase.constantize.all)
instance_var = instance_variable_get("@#{new_method.pluralize}")
send_data instance_var.public_send("to_csv_#{new_method.pluralize}"), filename: "#{new_method.pluralize}.csv"
end
end