Budgie
Budgie

Reputation: 2279

Permutating an existing array to seed a Rails database

I would like to seed my Rails app database with the permutation of an existing array of objects, and am unsure about the best way to go about this.

I currently have a Country model, with the following attributes:

create_table :countries do |t|
  t.string :name
  t.float :latitude_dec
  t.float :longitude_dec

  t.timestamps null: false
end

I have seeded this model from a .yaml file (as these attributes are static), and now would like to use these records to seed a CountryPair model (where the attributes are also static). This model will have the following attributes:

create_table :country_pairs do |t|
  t.string :country_a
  t.string :country_b
  t.string :pair_name
  t.float :country_a_latitude_dec
  t.float :country_b_latitude_dec
  t.float :country_a_longitude_dec
  t.float :country_b_longitude_dec
  t.float :distance

  t.timestamps null: false
end

The aim is to permutate the array of Country objects, and create a CountryPair object from each permutation (and seed the database with the output). I understand the Ruby array#permutation method, but am unsure about how to pull out the appropriate values into the new array of CountryPair objects. The order of countries in the pair is important here, so I'd like to use permutations rather than combinations.

Ultimately, I'd also like to calculate the distance between the country pairs, but I'm hoping to start figuring that out once I have the CountryPair model filled!!

This is my first foray back into Rails after a five year absence, so apologies if I've got some of the terminology/methodology wrong - please do ask for clarification if any further information is required! Thanks in advance!

Upvotes: 2

Views: 390

Answers (1)

Chakaitos
Chakaitos

Reputation: 116

You can add this snippet to your seeds.rb after the Countries are seeded.

Country.all.permutation(2) do |p| 
  CountryPair.create(
    country_a: p[0].name,
    country_b: p[1].name,
    pair_name: p[0]name + p[1].name,
    country_a_latitude_dec: p[0].latitude.dec,
    country_b_latitude_dec: p[1].latitude.dec,
    country_a_longitude_dec: p[0].longitude.dec,
    country_b_longitude_dec: p[1].longitude.dec,
    distance: # An algorithm to calculate distance
  )
end

Then run it with: rake db:setup

Upvotes: 1

Related Questions