#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")