ModelName.all和ModelName.where('')之间有什么区别

时间:2011-05-24 21:49:27

标签: ruby-on-rails-3

我有以下关系: 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是一个数组。

解释会帮助我理解这个概念以及我应该采取哪种方式。我不想通过单独查询每个提醒。付款来运行该组,然后对其进行总结。

1 个答案:

答案 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...