Создание новой таблицы — как настроить таблицу с двумя столбцами, ссылающимися на один и тот же столбец в другой таблице?

#ruby-on-rails

#ruby-on-rails

Вопрос:

Приложение имеет существующую таблицу exchanges и currencies . такое, что

 select id, name, currency_id from exchanges;

 id | name | currency_id
---- ------ -------------
  1 | ASX  | 1      (Australian Stock Exchange)
  3 | LSE  | 3      (London Stock Exchange)
  4 | NYSE | 2      (New York Stock Exchange)
  2 | AMEX | 2  
  

и

 select id, name from currencies;

 id | name 
---- ------
  1 | AUD     (Australian Dollar)
  2 | USD     (U.S. Dollar)
  3 | GBP     (Great Britain Pound)
  

Теперь я хочу разрешить пользователям с заданной базовой валютой, скажем, AUD (например @user.currency_id == 1 ), выполнять конвертацию валют. Изначально я думал о таблице в следующих строках

 exchange_rate table:
base_currency (currency_id), target_currency (currency_id), exchange_rate
  

например, могут иметь значения преобразования AUD в USD, где вы умножаете сумму AUD на 0,8235

 1, 2, 0.8235  
  

Если я попытаюсь создать таблицу exchange_rates с двумя вызываемыми столбцами currency_id , миграция завершится неудачей. Если я использую другое имя для одного из двух столбцов валюты, я получаю ошибки компиляции при попытке отобразить название валюты, например, @exchange_rate.base_currency.currency.name выдает ошибку, тогда как @exchange_rate.currency.name выдает AUD / USD / GBP.

В настоящее время таблица exchange_rate выглядит следующим образом

 table "exchange_rates", force: true do |t|
  t.integer  "base_currency"
  t.integer  "currency_id"
  t.float    "exchange_rate"
  t.datetime "created_at"
  t.datetime "updated_at"
end
  

Должен ли я изменить имена базы данных для таблицы exchange_rate или как мне ссылаться на exchange для base_currency.

Ответ №1:

В вашей модели ExchangeRate определите ассоциацию с использованием внешнего ключа

 has_one :base_currency,   foreign_key: 'base_currency', class_name: 'Currency'
has_one :currency
  

теперь вы можете получить доступ как к своей валюте, так и к базовой валюте следующим образом

 @exchange_rate.base_currency.name
@exchange_rate.currency.name
  

Комментарии:

1. Во-вторых, я не сторонник создания другой таблицы для сохранения обменного курса. Что вам нужно сделать, это взять любую валюту в качестве базовой валюты, а затем сохранить курсы в соответствии с выбранной постоянной базовой валютой. Например, вы выбрали доллар США в качестве базовой валюты, теперь в таблице валют добавьте поле exchange_rate и сохраните значения w.r.t в долларах США. И если кто-то хочет конвертировать из любых других двух валют, вы используете бизнес-логику, т.е. (сначала конвертируйте исходную валюту в доллар США, затем в целевую валюту)

2. Привет, Абк. Спасибо за ответы. 1- Я работаю над вашим первым решением, но по какой-то причине возникли проблемы с «@exchange_rate.currency.name «Однако я использую модель обмена, которая имеет belongs_to: currency в отличие от has_one. 2 — Отмечу ответ как правильный (но скоро вернусь домой), как только заработает отображение. 3- Никогда не думал о втором решении, которое я, возможно, заканчиваю внедрять. Спасибо — Pierre