2015-08-15 95 views
0

我有一個書籍集合,他們可以通過另一個表關聯很多主題。Rails/Active Record,通過關聯排序/ has_many計數

class Book < ActiveRecord::Base 
    has_many :book_topics, dependent: :destroy 
    has_many :topics, through: :book_topics 
end 

然後,我有一個助手,列出所有的話題,但我想列出主題,通過具有該主題圖書的數量進行排序。

我試過的變化:

def topic_list 
    Topic.joins(:book_topics) 
     .group("book_topics.topic_id") 
     .order("count(book_topics.book_id) desc") 
end 

沒有運氣。

+0

'book_topics.video_id'?該字段是否在'book_topics'表中?我希望看到'topic_id'。也許這就是問題所在? –

+0

是的,抱歉,這意味着要topic_id,而不是video_id - 不是問題,只是代表我輸入錯誤。 –

+0

然後解決你的問題。這對我來說似乎是合法的,問題到底是什麼? –

回答

0

認爲,要做到這一點適當的方式將實現counter cache

在book_topic.rb你會

class BookTopic < ActiveRecord::Base 
    belongs_to :topic, counter_cache: true 
end 

topic.rb應保持不變

class Topic < ActiveRecord::Base 
    has_many :book_topics, dependent: :destroy 
end 

然而,您必須將計數器列添加到主題表

class AddBookTopicsCountToTopics < ActiveRecord::Migration 
    def change 
    add_column :topics, :book_topics_count, :integer, default: 0 
    end 
end 

遷移它,如果您有現有記錄,請更新計數器值,並且從那裏可以很容易地按主題書籍數排序。

我意識到你想要一個查詢來解決這個問題,但根據我的經驗,這應該快得多。

sry如果有錯誤。計數器名稱並不是最好的,但文檔中有一個示例說明如何更改它。如果這還不夠,還有一個railscast視頻。

+0

謝謝,counter_cache像一個魅力一樣工作。 –