Экспорт Ruby on Rails в csv - поддерживает порядок операторов выбора mysql - PullRequest
0 голосов
/ 25 марта 2010

Экспорт некоторых данных из mysql в файл csv с помощью FasterCSV. Я бы хотел, чтобы столбцы в выводимом CSV были в том же порядке, что и оператор select в моем запросе.

Пример:

rows = Data.find(
  :all,
  :select=>'name, age, height, weight'
)

headers = rows[0].attributes.keys
FasterCSV.generate do |csv|
  csv << headers
  rows.each do |r|
    csv << r.attributes.values
  end
end

Выход CSV:

height,weight,name,age
74,212,bob,23
70,201,fred,24
.
.
.

Я хочу, чтобы столбцы CSV были в том же порядке, что и мой оператор select. Очевидно, что метод атрибутов не будет работать. Любые идеи о том, как обеспечить, чтобы столбцы в моем CSV-файле были в том же порядке, что и оператор select? Получил много данных и производительность это проблема. Оператор выбора не является статичным. Я понимаю, что могу перебирать имена столбцов внутри цикла rows.each, но это выглядит немного грязно.

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Используйте Запятую драгоценный камень:

class Data < ActiveRecord:Base

  comma do
    name
    age
    height
    weight
  end

  comma :height_weight do
   name
   age
   height_in_feet
   weight
 end


end

Теперь вы можете создать CSV следующим образом:

Data.all(:select => 'name, age, height, weight').to_comma

Data.all(:select => 'name, age, height_in_feet, weight').to_comma(:height_weight)

Edit:

Средство поиска ActiveRecord не поддерживает вычисляемые столбцы в наборе результатов, т. Е.

data = Data.first(:select => 'name, age, height/12 as height_in_feet, weight')
data.height_in_feet # throws error

Вы можете использовать select_extra_columns gem, если хотите включить вычисляемые столбцы.

0 голосов
/ 25 марта 2010

Попробуйте это:

def export_to_csv (rows, col_names)
  col_names = col_names.split(",") if  col_names.is_a?(String)
  FasterCSV.generate do |csv|
    # header row
    csv << col_names

    # data rows
    rows.each do |row|
      csv << col_names.collect{|name| row.send(name)}
    end
  end
end

cols = 'name, age, height, weight'
rows = Data.find(:all, :select=> cols)
csv = export_to_csv(rows, cols)
...