==
- это оператор сравнения . Когда вы пишете:
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))