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