好吧,数据库的东西变成了我的铁路弱点。
我想搜索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')}
这对我来说似乎很疯狂。我确信必须有一种方法可以直接将数据从数据库中删除,而无需迭代结果。有任何想法吗?提前干杯!
答案 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)