Это зависит от того, насколько динамичной должна быть ваша система. Вы можете сделать это просто с одним классом (и таблицей БД) для каждого типа метрики и связать их с помощью Country.has_many: foreign_direct_investment_metrics и т. Д. (Проще).
Или вы можете работать более динамично, я бы использовал наследование одной таблицы для метрик, например:
class Country < ActiveRecord::Base
has_many :data_points, :class_name => 'Metric'
has_many :foreign_direct_investments, :class_name => 'ForeignDirectInvestment'
end
class Metric < ActiveRecord::Base
belongs_to :country
end
class ForeignDirectInvestment < Metric
end
class OtherMetricType < Metric
end
# c = Country.new(:name => 'Brazil')
# c.data_points << ForeignDirectInvestment.new(:year => 2000, :value => 5.09)
# c.save
И ваша схема БД:
create_table "countries", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "metrics", :force => true do |t|
t.integer "country_id"
t.string "type"
t.integer "year"
t.float "value"
t.datetime "created_at"
t.datetime "updated_at"
end
Это позволяет добавлять методы в ForeignDirectInvestment, сохраняя при этом гибкость для записи большего количества метрик. Тем не менее, у STI ActiveRecord есть предостережения, такие как все ваши ключи для всех ваших моделей должны находиться в таблице базовых метрик. Здесь есть хорошее введение в ИППП: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/
Вы можете также рассмотреть документ db, например MongoDb. MongoMapper - это простой картограф данных для Mongo и Rails, который также облегчает решение подобных проблем. Смотри http://mongomapper.com/