0

私は 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(...)が、うまくいきません。

これを行う方法があれば何か考えはありますか?

4

2 に答える 2

1

あなたはすでに言及しました

customer.Purchases.where(...).sum(...) のようなものを考えていましたが、うまくいきません。

別の回答のコメントで、customer.purchasesすでに存在する関係について言及しています。

次に、メソッドも必要ですpurchases_datasetSequel::SQLite::Dataset返品対応モデルです。

だからあなたは試すことができます:

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

(うまくいかない場合:テーブルとモデルの定義を投稿してテストしてください)

于 2015-11-26T21:53:59.357 に答える
0

テーブルに参加するためにモデルで宣言された関連付けを使用できないようです。

続編のドキュメントでは、適切な 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)
于 2015-11-26T18:21:06.780 に答える