Использование Model.where с self.id или аналогичным при экспорте в .CSV - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь экспортировать данные в CSV на основе текущей страницы "show" case_main, на которой кнопка экспорта включена. Я считаю, что мне нужно что-то похожее на следующее, но я не могу заставить его работать. Любая попытка ссылки на self.id или: id приводит к ошибке или nil.

Billedtime.where(case_main_id: self.id).each do |time|

Использование Billedtime.all.each do | time |позволяет запускать код, но он, очевидно, захватывает все, а не только выставленные счета для текущего case_main.

case_main имеет два однозначных сообщения, составленное время и строковые элементы. Я пытаюсь объединить billedtimes + lineitems для конкретного case_main в один экспорт .CSV.

Вот код:

Модель:

  def self.to_csv
    desired_columns = ["Client Code",
                       "Case Name" ,
                       "Date",
                       "Description",
                       "Hours",
                       "Charge",
    ]
    CSV.generate(headers: true) do |csv|
      # Header columns
      csv << desired_columns
      # Data columns
      Billedtime.where(case_main_id: self.id).each do |time|
        csv <<
            [
                time.case_main.client.client_code,
                time.case_main.case_name,
                time.billedtime_date,
                time.billedtime_description,
                time.billedtime_hours,
                time.billedtime_total
            ]
      end

      Lineitem.where(case_main_id: self.id).each do |line|
        csv <<
            [
                line.case_main.client.client_code,
                line.case_main.case_name,
                line.lineitem_date.to_date,
                line.lineitem_description,
                ' ',
                line.lineitem_total
            ]
      end
    end
  end

Контроллер:

  def show
    @case_mains = CaseMain.where(:id => @case_main.id).limit(5)
    respond_to do |format|
      format.html
      format.csv { send_data @case_mains.to_csv, filename: "case-#{Date.today}.csv"}
    end
  end

Просмотр:

<%= link_to "Export Billed Items", case_main_path(format: "csv") %>

Спасибо!

1 Ответ

0 голосов
/ 01 ноября 2019

Проблема в том, что ваша модель не имеет атрибута id , поэтому self.id не выполняет эту работу. Вместо этого вы хотите получить текущую область с помощью all и выполнить итерацию по коллекции, используя each или find_each. Чтобы предотвратить запрос 1 + N, я также добавил необходимый вызов includes.

def self.to_csv
  CSV.generate(headers: true) do |csv|
    csv << [
      "Client Code",
      "Case Name",
      "Date",
      "Description",
      "Hours",
      "Charge"
    ]

    all.includes(:client, :billedtimes, :lineitems).find_each do |case_main|
      case_main.billedtimes.each do |billedtime|
        csv << [
          case_main.client.client_code,
          case_main.case_name,
          billedtime.billedtime_date,
          billedtime.billedtime_description,
          billedtime.billedtime_hours,
          billedtime.billedtime_total
        ]
      end

      case_main.lineitems.each do |lineitem|
        csv << [
          case_main.client.client_code,
          case_main.case_name,
          lineitem.lineitem_date.to_date,
          lineitem.lineitem_description,
          ' ',
          line.lineitem_total
        ]
      end
    end
  end
end

Вы можете подумать, я не хочу экспортировать записи all. Однако all (без получателя) работает с текущей областью, поэтому при использовании его в контексте CaseMain.where(id: @case_main.id).limit(5).to_csv вы получите коллекцию CaseMain.where(id: @case_main.id).limit(5).all.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...