续集关系和SQL函数

时间:2015-11-25 07:57:20

标签: ruby sequel sequel-gem

我正在使用Ruby Sequel,我需要查找自特定日期以来客户所花费的总金额。这段代码正在运行:

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

但是,我想知道是否有办法使用Customer和Purchases之间的Model关系,而不是使用where子句来查找Purchases,以便代码看起来更干净。

我在考虑像customer.Purchases.where(...).sum(...)这样的东西,但它没有用。

知道是否有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

你已经提到了

  

正在考虑像customer.Purchases.where(...)。sum(...)之类的东西,但它不起作用。

并在another answer的评论中提到与customer.purchases的关系已经存在。

然后你还应该有purchases_dataset - 方法。它是Sequel::SQLite::Dataset并返回模型。

所以你可以试试:

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

(如果它不起作用:您能否发布您的表格和模型定义以进行测试)

答案 1 :(得分:0)

您似乎无法使用模型中声明的关联来加入表格。

Sequel documentation仅建议采用以下方式生成正确的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)