Ruby on Rails: доступ и расширение SQL-запроса с помощью метода модели

#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, добро пожаловать. Я рад, что ответ был полезным.