2015-03-19 78 views
1

我正在尝试查找属于客户端数组的所有付款。通过与客户之间的账单关系,付款有一个has_one。如何通过数组通过关系查找所有记录

的车型包括:

class Payment < ActiveRecord::Base 
    belongs_to :bill 
    has_one :client, through: :bill 

class Client < ActiveRecord::Base 
    has_many :bills 
    has_many :payments, through: :bills 

class Bill < ActiveRecord::Base 
    belongs_to :client 
    has_many :payments 

我试图找到与下面的查询

@payments = Payment.joins(:bills).where('bill.client_id IN (?)', [1,2,3,4]) 

却得到了一个PG超时消息

试过.includes而不是.joins并且还收到PG超时消息

并且还尝试了

Payment.includes(:bill).where(bills: { 'client_id IN (?)', [1,2,3,4] }) 

感谢您的帮助。

+0

你的数据库有多大?你有bill_id的索引吗?即它只是窒息你有多少数据? – 2015-03-19 01:02:51

+1

另外 - 你有一个客户协会的付款...你试过类似'Payment.joins(:client).where(“clients.id”=> [1,2,3,4])' – 2015-03-19 01:04:06

+0

在dev ,没有太多的记录,但是在账单表上有一个client_id的索引,我尝试了客户端上的连接,但是它也超时了 – Steve 2015-03-19 01:14:13

回答

2

你有你的bill单数/复数错误的方式。当你创建一个字符串时,它必须是表名,所以它将是复数形式。当您使用散列格式时,您可以使用与您的关联相同的大小写(从Payment中单独使用)。所以:

Payment.joins(:bill).where(bills: { client_id: [1,2,3,4] }) 
+1

能够得到这个工作,但需要在Payment.joins(:bill).where(bills:{client_id:[1,2,3,4]})中记帐,而不需要帐单'' – Steve 2015-03-19 01:33:41

+0

似乎连接速度快于包括,有没有人知道如果加入是首选? – Steve 2015-03-19 01:34:41

+0

感谢您的信息,我会编辑我的答案(我可以发誓它是该协会的名称,谢谢)。 – smathy 2015-03-19 01:38:19