2015-03-02 59 views
0

我有以下幾點:Ruby on Rails的Active Record的查詢接口

models/like.rb

class Like 
    belongs_to :post 
end 

models/post.rb

class Post 
    has_many :likes, dependent: :destroy 

    def self.popular 
     Like.group(:post_id).count << ??? 
    end 
end 

我想使返回最熱門的職位範圍:有超過20個喜歡的帖子,但我不知道如何製作條件。

回答

2

你可以使用counter_cache來做到這一點。您將不得不創建一個額外的列,但在SELECTing時它更具性能。

models/like.rb

class Like < ActiveRecord::Base 
    belongs_to :post, counter_cache: true 
end 

models/post.rb

class Post < ActiveRecord::Base 
    has_many :likes, dependent: :destroy 

    def self.popular 
    where('likes_count > 20').order('likes_count DESC') 
    end 
end 

然後創建遷移:

class AddLikesToPosts < ActiveRecord::Migration 
    def change 
    add_column :posts, :likes_count, :integer, default: 0 
    end 
end 

並填充likes_count對於您目前的職位上rails console(只需要如果你已經有了一些CR ):

Post.find_each { |post| Post.reset_counters(post.id, :likes) } 

在此之後,每次您創建一個新的Like時,計數器將自動遞增。

+0

非常感謝,這就是答案! – user3754535 2015-03-03 05:35:43