2014-09-15 4 views
1

Я хотел бы спросить, знает ли кто-нибудь, как правильно перенести данные Mongoid в документ CSV? У меня есть модель Record, и я хочу, чтобы каждая строка из Record становилась строкой в ​​CSV-документе. Я получил 90 столбцов (ключей) в записи, и я хочу исключить некоторые из них из документа CSV, но я не буду вручную вводить каждый ключ, который должен быть в CSV-документе. Мой кодRuby on Rails Mongoid to csv

@all_rows = Record.all 
CSV.open(Rails.root.join('public', 'downloads', "file.csv"), "w") do |csv| 

    @allrows.all.each do |record| 
     csv << record 
    end 

Но это не работает Я получаю ошибку

undefined method `map' for #<Record:0x007f9cd9e242f8> 

если я добавлять record.to_s я стробирования документ полностью записей, как этот #<Record:0x007f801ba60d68> Если какой-либо один может помочь мне в почини это! Спасибо!

ответ

1

Вы используете метод << на csv (documentation), который ожидает вызова с массивом в качестве аргумента. Вот почему он пытается выполнить метод map в вашей записи.

Решение проблемы заключается в добавлении массива атрибутов вместо объекта записи. Существует метод attributes, который будет возвращать хэш со всеми атрибутами.

ignored_attributes = ["attribute_you_dont_want", "another_attribute"] 
@all_rows = Record.all 

CSV.open(Rails.root.join('public', 'downloads', "file.csv"), "w") do |csv| 
    @all_rows.each do |record| 
    csv << record.attributes.delete_if{ |attr, value| ignored_attributes.include?(attr) }.values 
    end 
end 

Обратите внимание, что я написал @all_rows.each, вы не должны вызывать all метод снова.

Этот код будет выполнять метод по атрибутам hash и будет удалять любые атрибуты с именами, входящими в массив ignored_attributes. delete_if возвращает хэш, на который вы можете вызвать метод values, чтобы возвращать только массив значений.

+0

Спасибо, я попробую! –

+0

Спасибо! Оно работает! Знаете ли вы, что я могу получить только «атрибуты» для создания заголовков, когда я делаю 'csv << record.attributes', он дает ошибку или как правильно вставить данные в CSV-документ, где заголовки имеют правильные значения в колонны. Потому что сейчас я получаю очень грязный документ. Большое спасибо за Вашу помощь! –

+0

Да, вы можете просто написать 'Record.attribute_names - ignored_attributes'. Минус-операция на массивах будет возвращать массив без атрибутов из массива 'ignored_attributes'. – Lucas

Смежные вопросы