Запрос связанных записей с использованием Active Record - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть модель Tippani, которая принадлежит другой модели Fiscal Year.

Tippani.rb

class QuotationTippani < ApplicationRecord
  belongs_to :fiscal_year
end

У меня есть два экземпляра класс tippani , принадлежащий одному финансовому году.

Я хочу получить экземпляры класса tippani, принадлежащего одному финансовому году.

Я пробовал что-то подобное :

 Tippani.where(fiscal_year_id == 4)

Но я получаю ошибку

неопределенная локальная переменная или метод `fiscal_year_id 'для main: Object

Кроме того, есть ли некоторые метод запроса, где я мог бы получить все экземпляры tippani , чей финансовый год меньше 2073 или какое-то число.

Примерно так:

Tippani.fiscal_year.where(year < 2074)

Ответы [ 3 ]

3 голосов
/ 13 февраля 2020

Вам нужно передать Hash в ваш метод запроса, например:

QuotationTippani.where(fiscal_year_id: 4)

или, если у вас есть FiscalYear доступный экземпляр и установлена ​​Fiscalyear#quotation_tippanies связь:

fiscal_year.quotation_tippanies

О фильтрации по year, речь идет об использовании joins и правильной передаче параметров:

QuotationTippani.joins(:fiscal_year).where('fiscal_years.year < ?', 2074)

В общем, я советую вам прочитать это руководство:

https://guides.rubyonrails.org/active_record_querying.html

Здесь вы найдете всю необходимую информацию.

1 голос
/ 13 февраля 2020

== - это оператор сравнения . Когда вы пишете:

Tippani.where(fiscal_year_id == 4)

Ruby обрабатывает fiscal_year_id как идентификатор и пытается найти локальную переменную или метод с именем fiscal_year_id и проверяет, равно ли оно 4. Так что даже если Вы назначили fiscal_year_id, по которому вы звоните:

Tippani.where(true) # or false

Это даже близко не нужно, поскольку вы хотите оценить WHERE tippanis.fiscal_year_id = 4 в базе данных.

Хэши в Ruby используйте hashrockets (=>) или двоеточия (:):

# you can assign any type of key with hashrockets
{ :foo => :bar, 1 => "first", true => "yes", false => "no" }
# colons coerce the keys to symbols
{ a: 1, b: 2, c: 3, "this gets cast to a symbol": 4 }

Обычно предпочтительны двоеточия. Когда вы вызываете метод, вы можете опустить фигурные скобки, если последний аргумент ha sh.

Tippani.where({ :fiscal_year_id => 4 }) # lots of noise
Tippani.where(fiscal_year_id: 4) # better

Кроме того, есть какой-то метод запроса, где я мог бы получить все типпани экземпляры, чей финансовый год меньше 2073 или какое-то число.

Примерно так:

Tippani.fiscal_year.where(year < 2074)

Опять же это не будет работать с < является оператором, и результатом оценки выражения является true или false.

ActiveRecord на самом деле не имеет элегантного способа обработки условий LT, GT, LTE и GTE. Поэтому вам нужно либо использовать строку:

Tippani.joins(:fiscal_year).where('fiscal_years.year < ?', 2074)

, либо использовать Arel :

Tippani.joins(:fiscal_year).where(FiscalYear.arel_table[:year].lt(2074))
1 голос
/ 13 февраля 2020

Вам нужно joins

Tippani.joins(:fiscal_year).where(fiscal_years: { id: 4 })

Второй вопрос также может быть обработан аналогичным образом.

Tippani.joins(:fiscal_year).where("fiscal_years.year < ?", 2074)   

Надеюсь, это поможет!

...