Запрос ActiveRecord (включает или присоединяется)

#ruby-on-rails #ruby #postgresql #rails-activerecord

#ruby-on-rails #ruby #postgresql #rails-activerecord

Вопрос:

У меня есть два класса:

 class Customer 
    has_many :packages
end

class Package 
    belongs_to :customer
end
  

Как я могу выполнить подобный запрос?

 Customer.includes(:packages).where(packages: 'expires_at < Date.current')
  

С помощью примерного теста из консоли я получил это: Customer Load (26.0ms) SELECT "customers".* FROM "customers" INNER JOIN "packages" ON "packages"."customer_id" = "customers"."id" WHERE (packages.expires_at < '2019-03-13') LIMIT $1 [["LIMIT", 11]]
Traceback (most recent call last):
ActiveRecord::StatementInvalid (PG::UndefinedFunction: ERROR: operator does not exist: integer = uuid)
LINE 1: ...INNER JOIN "packages" ON "packages"."customer_id" = "custome...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT "customers".* FROM "customers" INNER JOIN "packages" ON "packages"."customer_id" = "customers"."id" WHERE (packages.expires_at < '2019-03-13') LIMIT $1
irb(main):003:0>

Комментарии:

1. Решена. Моя миграция клиента была create_table :customers, id: :uuid do |t| , и я добавил type::uuid вот так: create_table :customers, id: :uuid, type: :uuid do |t|

Ответ №1:

Вы можете передать выражение where в кавычках и привязать значение для expires_at.

 Customer.includes(:packages).where('packages.expires_at < ?', Date.current)
  

Комментарии:

1. То же самое, я получил эту ошибку ActiveRecord::StatementInvalid (PG:: неопределенная функция: ОШИБКА: оператор не существует: целое число = uuid . Возможно, это потому, что я использую uuid вместо последовательных идентификаторов.

2. Это другая проблема. Не могли бы вы подробнее остановиться на этом? добавьте всю ошибку, которую вы получаете.

Ответ №2:

Вы можете сделать это:

 Customer.includes(:packages).where('packages.expires_at < ?', Date.current).references(:packages)
  

Комментарии:

1. Я получил эту ошибку ActiveRecord::StatementInvalid (PG::UndefinedFunction: ERROR: operator does not exist: integer = uuid . Возможно, это потому, что я использую uuid вместо последовательных идентификаторов.

Ответ №3:

 Customer.joins(:packages).where("packages.expires_at < CURRENT_DATE")
  

или

 Customer.includes(:packages).where("packages.expires_at < CURRENT_DATE").references(:packages)
  

Комментарии:

1. Вместо того, чтобы ожидать код для вашего запроса, сосредоточьтесь на ошибке, которую вы получаете при их применении @DokNabaku.

Ответ №4:

Вы можете сделать это:

 Customer.includes([:packages]).where(["packages.expires_at < ?', Date.today]).references(:packages).order("Customers.created_at desc")