Ruby on Rails主动记录查询接口

时间:2015-03-02 23:52:51

标签: ruby-on-rails ruby ruby-on-rails-4

我有以下内容:

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个喜欢的帖子,但我不知道如何制作条件。

1 个答案:

答案 0 :(得分: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以获取您当前的帖子(仅在您已创建帖子时才需要):

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

在此之后,每次创建新的Like时,计数器将自动递增。