从DB获取最高投票模型的排序列表

时间:2014-07-26 10:41:11

标签: activerecord ruby-on-rails-4

使用:Rails 4.1.4,PostgreSQL 9.1.13

您好。我有一个简单的问题,但由于某种原因,我无法完成它。图为:

模型

class Article < ActiveRecord::Base
  belongs_to :user
  has_many   :votes
end

class User < ActiveRecord::Base
  has_many :articles
  has_many :votes
end

class Vote < ActiveRecord::Base
  belongs_to :article
  belongs_to :user, scope: :hotel_id

  validates_inclusion_of  :value, in: 0..5
  validates_uniqueness_of :user_id, :article_id
end

  • 每个用户可以为每篇文章投票,但只能投票一次(以避免多次投票)。
  • 投票模型的“值”属性为0..10。
  • 除标准CRUD方法之外的ArticlesController具有动作#showcase,它必须从DB返回5篇具有最高投票评级的文章,并按降序排序(并呈现相应的视图)。

所以我理解正确的方法是在文章模型中编写类方法(类似于“by_top_votes”),并在ArticlesController#showcase中使用它:

def showcase
  @top_five_articles = Article.by_top_votes
end

问题是我无法向DB写出正确的查询,它将:1)找到文章,2)查找每篇文章的所有投票,3)总结相应文章投票的所有值,4)排序他们(这一步我知道该怎么做)。

感谢您的阅读和帮助。

P.S。也许我解决问题的方法几乎是错误的。如果是这样,请告诉我正确的。

1 个答案:

答案 0 :(得分:0)

好的,我自己完成了。如果有人会遇到同样的问题,这里有解决方案。

1。在投票模型中总​​结了投票的价值:

def self.sum_value
  sum(:value)
end

2。将新属性(和列)添加到文章 - user_rating:integer

3. 在文章模型中定义两个类方法:

# assign user_rating attribute with the sum of all votes values
def set_user_rating
  user_rating = self.votes.sum_value
  self.update_attribute(:user_rating, user_rating)
end

# get top 5 articles by user_rating value from db
def self.top_by_user_rating
  Article.order(:user_rating).reverse_order.limit(5)
end

4。ArticlesController定义showcase操作中:

def showcase
  @top_articles = Article.top_by_user_rating               
end

<强> 5 即可。在VotesController定义create操作中:

  def create
    @article = Article.find(params[:article_id])
    @vote = @article.votes.create(vote_params)
    if @vote.save
      @article.set_user_rating
      redirect_to @article, notice: "Thanks for your vote"
    else
      .
    end
  end

它起作用,测试正在通过。