Связи сиквела и функции 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)