Rails экспорт в csv через ассоциации - PullRequest
2 голосов
/ 06 июня 2019

У меня проблема с ассоциациями и загрузкой через csv экспорт.

Мой экспорт работает, если данные присутствуют в торговой ассоциации, но если нет данных, мой экспорт остается пустым.Удаление части i.sales.each do приведет к полному экспорту полей i.item_name и i.item_number.

Итак, если в моей ассоциации нет данных, мой экспорт остается пустым.Есть ли способ проверить, есть ли у ассоциации информация?Я ищу, чтобы включить пустые поля, если нет данных.

Я пытался i.try(:sales).each do |sale| безрезультатно.

CSV.generate(headers: true) do |csv|
  csv << attributes
  all.each do |i|
    i.sales.each do |sale|
      csv << [
          i.item_name,
          i.item_number,
          sale.try(:sale_cost)
      ]
     end
   end
 end

Ответы [ 4 ]

4 голосов
/ 12 июня 2019

Вам нужно использовать левое соединение, чтобы получить все записи из первой таблицы.Это даст вам NULL значения для связанной таблицы, как вам нужно.

ПРИМЕЧАНИЕ: Пожалуйста, измените ссылки на Product модель / таблицу на соответствующую.

Рельсы 5 и выше

left_joins(:sales).select('products.*, sales.sale_cost').each do |product|
  csv << [
    product.item_name,
    product.item_number,
    (product.sale_cost || 'N/A')
  ]
end

Рельсы 4 и ниже

Product.joins("left join sales on products.id = sales.product_id")
       .select('products.*, sales.sale_cost')
       .each do |product|

  csv << [
    product.item_name,
    product.item_number,
    (product.sale_cost || 'N/A')
  ]
end

Это приведет к чему-то вроде:

pencil,12345,20
pencil,12345,10 
eraser,11223,5
box,11333,N/A
0 голосов
/ 16 июня 2019

То, что @Sascha Mayr говорит, это нормальный путь.Подумайте о данных, которые вы хотите представить в этом CSV.Как бы вы назвали каждый из этих рядов?Теперь это продажа, нет?Но ваша исходная модель - это предмет.Если бы была добавлена ​​новая ассоциация, например "favs", как бы вы назвали каждый ряд?

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

0 голосов
/ 09 июня 2019

Почему бы не запросить продажи по идентификатору ассоциации?
Предполагая, что i соответствует названию модели Item, вы можете сделать что-то вроде:

all.each do |i|
  Sale.where(item_id: i.id).each do |sale|
    csv << [
      i.item_name,
      i.item_number,
      sale.try(:sale_cost)
    ]
  end
end

или выберите только записи, где присутствуют продажи:

joins(:sales).group('items.id').each do |i|
  i.sales.each do |sale|
    csv << [
      i.item_name,
      i.item_number,
      sale.try(:sale_cost)
    ]
  end
end
0 голосов
/ 06 июня 2019

Попробуйте следующий код

CSV.generate(headers: true) do |csv|
  csv << attributes
  all.each do |i|
    if i.sales.present?
     i.sales.each do |sale|
       csv << [
           i.item_name,
           i.item_number,
           sale.try(:sale_cost)
       ]
      end
    else
     csv << [
       i.item_name,
       i.item_number
     ]
    end
   end
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...