创建一个只计算具有条件的记录的counter_cache

时间:2015-07-16 09:18:00

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

A"用户"有很多"帖子"。我想在"用户"中创建一个counter_cache。这表明他们有多少帖子。

这很容易做到 - 但我只希望将帖子计入counter_cache,如果它们是公开的(即post.is_public === true)。

如何在users表中创建一个包含公共帖子总数的列?

class User < ActiveRecord::Base
  // Columns:   id:integer   name:string
  has_many :posts
end

class Post < ActiveRecord::Base
  // Columns:  id:integer   user_id:integer   is_public:boolean   content:text

  belongs_to :user, dependent :destroy, counter_cache: true
end

2 个答案:

答案 0 :(得分:0)

如果要使用update更新该counter_cache,可以使用ActiveRecord回调:http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html。然后你可以在回调声明中使用条件:

before_save :counter_cache, if: proc { |r| r.public }

或者你可以在counter_cache方法本身内有条件,如果它知道记录。否则你可以使用上面的行。

此外,使用post.is_public比使用if a > 3 === true更加惯用(和干净),而不是将它与严格比较,就像你没有说`setcookie("user", $username, time() + 3600, '/');`

一样

答案 1 :(得分:0)

首先,您需要在用户模型中建立关联并发布模型

class User < ActiveRecord::Base
 has_many :posts
end

class Post < ActiveRecord::Base
belongs_to :user
end

使用以下命令

将列名作为counter_cache
 rail g migration add_counter_cache_to_users post:references

现在用户ID在post表中,您可以获取控制器中用户的帖子数量 首先检查公开信息

 if post.is_public === true
 User_Record = User.first
 id= User_record.id
 user_Post=Post.where(:user_id=>id)
 end

您将根据用户ID

获取用户的信息