如何在3个级别的模型中创建活动记录搜索?

时间:2011-06-22 11:53:38

标签: ruby-on-rails activerecord

好吧,数据库的东西变成了我的铁路弱点。

我想搜索3个模型:用户,发票,付款

用户has_many发票和Invoice has_many付款。

我正在尝试创建一个搜索,以查找给定日期范围内current_user的所有付款。

到目前为止,这就是我这样做的方式

invoices = current_user.invoices
payments = invoices.inject([]) {|arr,x| arr += x.payments.where("payment_date <= ? and payment_date >= ?", '2011-02-01', '2011-01-01')}

这对我来说似乎很疯狂。我确信必须有一种方法可以直接将数据从数据库中删除,而无需迭代结果。有任何想法吗?提前干杯!

1 个答案:

答案 0 :(得分:4)

你应该使用类似的东西:

Payments.joins(:invoice => :user).where("users.id = ? AND (payments.payment_date <= ? and payments.payment_date >= ?)", current_user.id, '2011-02-01', '2011-01-01')

您可能希望阅读有关active record query

的Ruby On Rails指南

<强>更新

从链接指南中,语法更清晰:

time_range = (Time.now.midnight - 1.month)..Time.now.midnight
Payments.joins(:invoice => :user).where(:users => {:id => current_user.id}, :payments => {:payment_date => time_range})

更新2,另一个解决方案:

在您的模型中User

has_many :payments, :through => :invoices

执行查询:

time_range = (Time.now.midnight - 1.month)..Time.now.midnight
current_user.payments.where(:payment_date => time_range)