我有以下关系:
User --has many--> Reminders --has many--> Payments
我将用户的所有付款都视为
payments = User.reminders.collect{|reminder| reminder.payments.between(from_date, to_date)}.flatten
然后
data = payments.select("SUM(amount) as total_payment, MONTH(payment_date) as month, YEAR(payment_date) as year").group("MONTH(payment_date), YEAR(payment_date)").map{|payment| [payment.total_payment, "#{payment.month}/#{payment.year}"]}
我试图在数据集上运行上面的select和group by group,但数据集失败并出现以下异常:
ArgumentError: wrong number of arguments (1 for 0)
from (irb):162:in `select'
以上查询在Payments.where('')上正常运行,但在Payments.all或我上面获得的数据集上失败。
在调试时,我发现Payments.where('')是一个ActiveRecord::Relation
对象,而Payment.all是一个数组。
解释会帮助我理解这个概念以及我应该采取哪种方式。我不想通过单独查询每个提醒。付款来运行该组,然后对其进行总结。
答案 0 :(得分:1)
此时你有一个Payment对象数组,而不是一个Relation,它代表一个尚未运行的查询。有两种方法可以解决这个问题。第一种方法是将付款建立为关系而不是数组。我会通过在用户和付款之间添加has_many :through
关系来实现此目的。
class User < ActiveRecord::Base
has_many :reminders
has_many :payments, :through => :reminders
end
payments = user.payments.between(from_date, to_date)
data = payments.select....
另一种方法是将数组中的id传递给where子句:
payments = user.reminders.collect {...}.flatten
data = Payment.where('id in (?)', payments).select...