0

我想根据它的总票数来排序帖子。这就是我在 Post 模型中的内容:

class Post < ActiveRecord::Base
  attr_accessible :title, :url
  validates :title, presence: true
  validates :url, presence: true
  has_many :votes

  def vote_number
    votes.where(direction: "up").count - votes.where(direction: "down").count
  end
end

这就是我在 Post Controller 中尝试做的事情:

def index
  @posts = Post.last(10).order('vote_number')
end

尽管如此,我还是从索引中得到了这个错误:

undefined method `order' for #<Array:0x3787158>

Stack Overflow 中的其他问题通过在 Post Controller 中进行计算解决了这个问题,但我不能这样做,因为投票是数组而不是整数。

4

4 回答 4

1

找到了解决它的方法。我没有使用 order,而是使用了 sort_by。

而不是在 Post 控制器中使用它:

def index
  @posts = Post.last(10).order('vote_number')
end

我使用了 sort_by:

def index
  @posts = Post.all.sort_by{|post|-post.vote_number}
end
于 2013-04-22T15:47:10.993 回答
0

您应该尝试计数器缓存。您可以从以下链接中了解更多信息 -

如何使用 ActiveRecord 按作者的书数对作者进行排序?

http://hiteshrawal.blogspot.com/2011/12/rails-counter-cache.html

http://railscasts.com/episodes/23-counter-cache-column

计数器缓存仅在 rails 内有效。如果您从外部应用程序更新,您可能需要做一些工作。

于 2013-04-22T02:02:41.893 回答
0

firstlastall执行查询。始终在这三个之前插入顺序。

于 2013-04-22T12:04:59.880 回答
0
class Post < ActiveRecord::Base
  attr_accessible :title, :url
  attr_reader :vote_difference # getter
  attr_writer :vote_difference # setter
  validates :title, presence: true
  validates :url, presence: true
  has_many :votes
end

class Vote < ActiveRecord::Base
  belongs_to :post, :counter_cache => true

  #more class methods here      


  def after_save
    self.update_counter_cache
  end

  def after_destroy
    self.update_counter_cache
  end

  def update_counter_cache
    post.vote_difference = post.comments.where(direction: 'up').count - post.comments.where(direction: 'down').count
    post.save
  end
end

现在您可以在查询时按 vote_difference 排序。例如 -

posts = Post.order(:vote_difference, :desc)

我没有检查我的代码的正确性是的。如果您发现任何问题,请告诉我。我相信它可以适应使其工作。

如果您按照此模式使用 counter_cache,您可能会运行迁移以添加 vote_difference 列,并运行另一个迁移以更新先前创建的帖子的 vote_difference 列。

于 2013-04-23T07:01:47.683 回答