我想根据它的总票数来订购帖子。这就是我在帖子模型中所拥有的:
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中进行计算解决了这个问题,但我不能这样做,因为投票是数组而不是整数。
答案 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)
first
,last
和all
执行查询。总是在这三个之前插入订单。
答案 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列。