Rails命令在模型中通过def发布

时间:2013-04-22 01:48:05

标签: ruby-on-rails ruby-on-rails-3.2

我想根据它的总票数来订购帖子。这就是我在帖子模型中所拥有的:

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 个答案:

答案 0 :(得分:1)

找到解决问题的方法。而不是使用订单我使用sort_by。

而不是在Post Controller中使用它:

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

我使用了sort_by:

def index
  @posts = Post.all.sort_by{|post|-post.vote_number}
end

答案 1 :(得分:0)

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

How to sort authors by their book count with ActiveRecord?

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

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

计数器缓存仅适用于rails。如果您从外部应用程序更新,则可能需要进行一些解决方法。

答案 2 :(得分:0)

firstlastall执行查询。总是在这三个之前插入订单。

答案 3 :(得分: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列。