Связи сиквела и функции SQL

Я использую Ruby Sequel, и мне нужно узнать общую сумму, потраченную клиентом с определенной даты. Этот код работает:

customer = Customer.where(username: params[:username]).first
unless customer
  exit
end
Purchases.where(customer: customer).and('date < ?', params[:date]).sum(:amount)

Однако мне интересно, есть ли способ использовать отношение Модель между Покупателем и Покупками и не использовать условие where для поиска Покупок, чтобы код мог выглядеть чище.

Я думал о чем-то вроде customer.Purchases.where(...).sum(...) но это не работает

Есть идеи, если есть способ сделать это?

2 ответа

Решение

Вы уже упоминали

думал о чем-то вроде customer.Purchases.where (...). sum (...), но это не работает.

и в своем комментарии в другом ответе вы упоминаете связь с customer.purchases уже существует.

Тогда вы также должны иметь purchases_dataset-метод. Это Sequel::SQLite::Dataset и возвращает модели.

Так что вы можете попробовать:

customer.purchases_dataset.where('date < ?', params[:date]).sum(:amount)

(Если это не сработает: не могли бы вы опубликовать определение таблицы и модели для проведения теста)

Кажется, вы не можете использовать ассоциации, объявленные в модели, чтобы присоединиться к таблице.

Документация сиквела предлагает только следующий способ генерирования правильного SQL:

Album.join(:artists, :id=>:artist_id)
# SELECT * FROM albums
# INNER JOIN artists ON artists.id = albums.artist_id

В вашем случае это может выглядеть так:

Customer.join(:purchases, customer_id: :id).where('date < ?', params[:date]).sum(:amount)
Другие вопросы по тегам