2009-11-17 83 views
2

我有建議模型和簽名模型。使用包含/連接

提案屬於建議

我的關係很好地工作,當我選擇一個建議,但是當我做了Proposal.search並返回多個提案,我不能訪問簽名人簽名和簽名。

我想通過我的簽名數的建議排序,所以我想這:

Proposal.find(:all, :limit => 3, :include => [:signatures]) 

現在,當我調試(@proposals)我確實看到相應的簽名。我如何訪問它們並寫入:order => signatures.count?

我對包含/連接不是很熟悉......所以讓我知道如果我以錯誤的方式去做。謝謝。

+0

你的意思是說你「看不到相應的簽名」? – ScottJ 2009-11-17 19:27:14

+0

他看到了相應的簽名,因爲:包含正確包含關聯的簽名,但只是執行SELECT * - 因此它不包含任何虛擬count()列。 – bensie 2009-11-17 19:30:07

+0

當我包括我看到他們。 – asdfasdfasdfasdf 2009-11-17 19:37:18

回答

1

:include用於您稍後需要訪問簽名時。如果您需要的僅僅是用於排序的相關簽名的數量,那麼您不需要:include

我並不特別喜歡以下,但它似乎工作:

Proposal.find(:all, 
       :limit => 3, 
       :joins => :signatures, 
       :group => 'proposals.id', 
       :order => 'count(proposals.id) desc') 

首先,:joins參數意味着每個提案記錄,您將獲得另一行中的輸出爲每個相關的簽名。 :group參數將這些行合併爲一個,但僅在參數:order基於每個proposal.id(以及因此簽名的數量)的行數進行排序之後。

我懷疑有更好的辦法,但這似乎工作。

2

爲了讓您熟悉使用includes還是join,請查看致力於它的Railscast。您無法通過signatures.count進行排序的原因是您沒有選擇包含該信息的列(或虛擬列)。

你會想要結合使用:select和:join來獲得你想要的。

+0

酷,有用的鏈接。謝謝。 – asdfasdfasdfasdf 2009-11-17 19:41:16

1

我建議使用ActiveRecord的counter cache功能。一個signatures_count字段添加到您的提案模型,然後你可以命令這樣做:

Proposal.find(:all, :limit => 3, :include => [:signatures], :order => 'signatures_count DESC') 

退房上面鏈接瞭解更多詳情belongs_to的API文檔。這個here有一個更老的Railscasts插曲。