2015-03-19 105 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