Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails 5中,我如何使代码干涸,以便从我的动作控制器和应用程序记录中导出不同的CSV?_Ruby On Rails_Ruby On Rails 5_Dry - Fatal编程技术网

Ruby on rails 在rails 5中,我如何使代码干涸,以便从我的动作控制器和应用程序记录中导出不同的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

我有一个应用程序,其唯一目的是种子数据文件和添加数据到不同的CSV是压缩和导出的用户。我的应用程序控制器中充满了这样的行:

  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 结束
  • 每个控制器都有自己的控制器(无法从不同的视图和其他控制器轻松访问它们)
  • 我还试图弄清楚如何创建自己的模块,但无法做到这一点
我的申请记录同样糟糕,重复的行仅用于导出CSV:

      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