Export to excel using csv library

116 views Asked by At

I have the following code to export to excel

on my controller:

def users_report
    @users = Kid.where(confirmation_token: nil).paginate(:page => params[:page], :per_page => 30)
    @userxls = Kid.where(confirmation_token: nil)
    respond_to do |format|
        format.html
        format.xls { send_data @userxls.to_csv({col_sep: "\t"})  }
    end
end

on my model:

  def self.to_csv(options = {})
        CSV.generate(options) do |csv|
        csv << ["Name", "Surname", "E-mail", "Birthday", "School", "Class", "Native Language", "Practised Language", "Conversations same Native", "Convserations different Native", "Message same Native", "Message different Native", "Posts", "Videos watched", "Clossed/Finished calls", "Missed calls", "Connections per Week", "Nb of foreign friends", "Nb of friends same country", "Activation Date", "Email Parent", "Parent Activated"]
            all.each do |kid|
                kids = Array.new

                kid.name = kid.name rescue "No name"
                kid.surname = kid.surname rescue "No surname"
                kid.email = kid.email rescue "No email"
                kid.birthday = kid.birthday rescue "No age"
                kid.school.name = kid.school.name rescue "No School"
                kid.courses.first.name = kid.courses.first.name rescue "No Course"
                kid.native_languages = kid.native_languages rescue "No native language"
                kid.practice_languages = kid.practice_languages rescue "No practise language"
                kid.number_of_native_conversations = kid.number_of_native_conversations rescue "0"
                kid.number_of_foreign_conversations = kid.number_of_foreign_conversations rescue "0"
                kid.number_of_native_messages = kid.number_of_native_messages rescue "0"
                kid.number_of_foreign_messages = kid.number_of_foreign_messages rescue "0"
                kid.number_of_activity_posts = kid.number_of_activity_posts rescue "0"
                kid.number_of_finished_closed_calls = kid.number_of_finished_closed_calls rescue "0"
                kid.number_of_missed_calls = kid.number_of_missed_calls rescue "0"
                kid.avg_of_connections_week = kid.avg_of_connections_week rescue "0"
                kid.number_of_foreign_friends = kid.number_of_foreign_friends rescue "0"
                kid.number_of_friends_same_country = kid.number_of_friends_same_country rescue "0"
                kid.confirmed_at = kid.confirmed_at.try(:strftime, "%d/%m/%Y")
                kid.tutor.email = kid.tutor.email rescue 'No parent email'
                kid.tutor.confirmed = kid.tutor.confirmed rescue 'No parent email'



                kids << [kid.name, kid.surname, kid.email, kid.birthday, kid.school.name, kid.courses.first.name, kid.native_languages, kid.practice_languages, kid.number_of_native_conversations, kid.number_of_foreign_conversations, kid.number_of_native_messages, kid.number_of_foreign_messages, kid.number_of_activity_posts, kid.number_of_finished_closed_calls, kid.number_of_missed_calls, kid.avg_of_connections_week, kid.number_of_foreign_friends, kid.number_of_friends_same_country, kid.confirmed_at.try(:strftime, "%d/%m/%Y"), kid.tutor.email, kid.tutor.confirmed? ]
                kids.each do |k|
                    csv << k
                end
            end
      end
  end

I know this code is horrible, but I getting the following problem:

1) I can insert electments directo on my csv array, because when I open the file I get something like #kid<3248293028>, instead of name, surname, email, bla bla bla, this I why I have to insert first on a kids array and then using a each, insert in the csv array.

2)Inside my model I have several methods, like age, to get the age of the kids:

def age
    now = Time.now.utc.to_date
    (now.year - self.birthday.year - (self.birthday.to_date.change(:year => now.year) > now ? 1 : 0)) rescue (now.year - self.birthday.year)
  end

but the t0_csv method does not see this method, I have the same problem with other methods like:

sentence_native_languages_of sentence_practise_languages_of number_of_native_conversations number_of_foreign_conversations number_of_native_messages etc etc etc, all of then exist in the model but the to_csv never see this methods.

Why, help me to understand.

Thanks in advance.


UPDATE


here is one of the method that my to_csv method can't see

def number_of_native_conversations
    na_messages = 0

    KidConversation.all_for(self).each do |conversation|
      na_messages += 1 unless conversation.foreign_conversation_for? self
    end

    return na_messages
  end
0

There are 0 answers