置换现有数组以为Rails数据库设定种子

时间:2015-03-02 17:56:15

标签: ruby-on-rails ruby arrays seeding

我想通过现有对象数组的排列来为我的Rails应用程序数据库提供种子,并且不确定最佳方法。

我目前拥有Country模型,具有以下属性:

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

  t.timestamps null: false
end

我已经从.yaml文件播种了这个模型(因为这些属性是静态的),现在想要使用这些记录来种子CountryPair模型(其中属性也是静态的)。该模型将具有以下属性:

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

目的是置换Country个对象的数组,并从每个排列创建一个CountryPair对象(并使用输出为数据库设定种子)。我理解Ruby array#permutation方法,但不确定如何将适当的值提取到新的CountryPair对象数组中。这对中的国家的顺序很重要,所以我想使用排列而不是组合。

最终,我还想计算国家/地区之间的距离,但我希望在我填充CountryPair模型后开始计算出来!

这是我在缺席五年后第一次回到Rails,所以如果我的某些术语/方法有误,请向我道歉 - 如果需要进一步的信息,请要求澄清!提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以在种子播种后将此片段添加到seeds.rb。

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

然后使用:rake db:setup

运行它