0

I am generating an Excel sheet using Axlsx gem. However two of the fields are arrays of IDs from others models ; health.source_of_power and **health.service_offered**

@healths.each do |health|
        sheet.add_row [District.find(health.district).name,County.find(health.county).name,SubCounty.find(health.sub_county).name,health.name_of_institution,health.money_received,health.date_received,health.use_of_money,health.grade_of_health_center,health.opening_time.strftime("%I:%M %p"),health.closing_time.strftime("%I:%M %p"),health.service_offered,health.other_service_offered,health.male_patients,health.female_patients,health.brick_and_wattle,health.mad_and_wattle,health.other_structures,health.source_of_power,health.other_source_of_power,health.toilet_facilities,health.alternative_disposal,health.separate_toilets,health.running_water,health.alternative_water,health.state_of_water,health.duration_non_functional,health.placenta_pit,health.placental_disposal,health.waste_pit,health.waste_disposal,health.storage_expired_drugs,health.expired_drugs_storage,health.pregnant_mother,health.number_of_beds,health.delivery_beds,health.ambulance,health.status_of_ambulance,health.keep_records,health.number_of_staff,health.medical_staff,health.resident_medical_staff]
    end

How can i generate a list of the names of the fields by iterating through the Arrays.

1 Answers1

0

I am guessing you want a list of names in one cell. Assuming you have a Employee model that represents the sources of power (change to whatever yours is), just find and map the ids:

Employee.where(id: health.source_of_power).pluck(:name).join(',')

Or, if you have first and last:

Employee.where(id: health.source_of_power).pluck(:first, :last).map {|t| t.join(' ')}.join(', ')

You could get more efficient if you had an indexed hash of employees ahead of time. Then you aren't running a query per row:

employees_by_id = Employee.all.index_by(&:id)
@healths.each do |health|
  sources_of_power = employees_by_id.values_at(health.source_of_power).map(&:name)
  sheet.add_row [...,sources_of_power,...]
end

You could use scopes and relations on the health object if they were there. Your info is a bit vague.

noel
  • 2,095
  • 14
  • 14