#ruby-on-rails
#ruby-on-rails
Вопрос:
В приложении Ruby on Rails, над которым я работаю, есть exchange_rate
таблица, к которой я хочу получить доступ при выполнении вычислений для конвертации одной валюты в другую. Таблица выглядит следующим образом:
id | base_currency_id | currency_id | exchange_rate |
--- ------------------ ------------- ---------------
2 | 1 | 2 | 0.9345 |
3 | 1 | 3 | 0.5000 |
exchange_rate
Модель выглядит следующим образом:
class ExchangeRate < ActiveRecord::Base
include ActiveModel::ForbiddenAttributesProtection
validates :base_currency_id, :currency_id, :exchange_rate, presence: true
...
def self.matching_exchange_rate(base_currency)
ExchangeRate.where("base_currency_id = ?",base_currency)
end
# Commented out as I can't get it to work yet:
# def self.matching_exchange_rate (base_currency, target_currency_id)
# where("base_currency_id = ?",base_currency " and currency_id = ?",target_currency_id)
# end
Я вызывал незавершенную, но работающую функцию matching_exchange_rate
следующим образом:
x_rate = ExchangeRate.matching_exchange_rate(user_currency_id)
puts "x_rate = " x_rate.to_s
Это отображается в журнале как:
x_rate = #<ExchangeRate::ActiveRecord_Relation:0x0000010b434c78>
Я хотел бы получить помощь по любому из этих вопросов:
(1) Как мне изменить matching_exchange_rate
метод, чтобы он использовал два входных параметра? Я перепробовал большое количество различных комбинаций — одна из которых приведена в закомментированном коде выше — но пока мне не везло.
(2) Как мне получить доступ к exchange_rate
из возвращаемого значения? (например, ActiveRecord_Relation
)
Заранее спасибо за любую помощь, Пьер
Ответ №1:
Вы можете использовать pluck
для выбора exchange_rate
с предоставленным условием следующим образом:
def self.matching_exchange_rate(base_currency, target_currency_id)
where(
"base_currency_id = ? and currency_id = ?", base_currency,target_currency_id
).pluck(
'exchange_rate'
).first
end
Приведенный выше код заменяет ваш закомментированный метод. Что касается следующего опубликованного вами вывода:
x_rate = #<ExchangeRate::ActiveRecord_Relation:0x0000010b434c78>
where
возвращает ActiveRecord::Relation
. Вы могли бы использовать first
метод в своем AR-запросе, чтобы получить ссылку на первую ExchangeRate
запись, к которой вы могли бы обратиться exchange_rate
следующим образом:
x_rate = ExchangeRate.matching_exchange_rate(user_currency_id).first.exchange_rate
puts "x_rate = " x_rate.to_s
Комментарии:
1. @user1854802, добро пожаловать. Я рад, что ответ был полезным.