如何在Ruby on Rails中获得未投票的帖子数

时间:2013-05-10 07:35:51

标签: ruby-on-rails ruby ruby-on-rails-3 erb

我使用Thumbs_up gem来创建投票功能。我有3个表 - 帖子,用户和投票,其中帖子 acts_as_voteable ,用户 acts_as_voter

Model Post.rb

class Post < ActiveRecord::Base
  attr_accessible :title, :content, :user_type
  acts_as_voteable
  validates_presence_of :title,:content
  default_scope order: 'posts.created_at DESC'
end

Model Vote.rb

class Vote < ActiveRecord::Base
    scope :for_voter, lambda { |*args| where(["voter_id = ? AND voter_type = ?", args.first.id, args.first.class.base_class.name]) }
    scope :for_voteable, lambda { |*args| where(["voteable_id = ? AND voteable_type = ?", args.first.id, args.first.class.base_class.name]) }
    scope :recent, lambda { |*args| where(["created_at > ?", (args.first || 2.weeks.ago)]) }
    scope :descending, order("created_at DESC")
    belongs_to :voteable, :polymorphic => true
    belongs_to :voter, :polymorphic => true
    attr_accessible :vote, :voter, :voteable

end

Model User.rb

class User < ActiveRecord::Base
   attr_accessible :name, :email, :password, :password_confirmation
   has_secure_password
   acts_as_voter
   has_many :posts, dependent: :destroy
end

现在我想计算 NOT VOTED 的帖子号码。我想这样做..

<%= Post.joins(:votes).where("dont_know_how_to_write_condition").count %>

任何帮助?提前致谢

2 个答案:

答案 0 :(得分:2)

我不确定这是否适用于sqlite,但它应该在postgresql上。

  def self.not_voted
    joins("left outer join votes on votes.voteable_id = posts.id").
    where("votes.id is null")
  end

然后:

Post.not_voted.count

答案 1 :(得分:0)

有些方法可以在SQL中使用NOT EXISTS来执行该条件,但它们是非常繁重的查询。如果这是一个面向公众或多次进行的行动,那么这样做可能太沉重了。我建议你对表格进行非规范化并在帖子中包含一个投票数。只需使用观察者进行投票创建和删除即可更新帖子的投票计数。然后查询就像

Post.where('votecount = 0')

此查询比前一个查询轻松且可扩展