#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