使用: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
观
所以我理解正确的方法是在文章模型中编写类方法(类似于“by_top_votes”),并在ArticlesController#showcase中使用它:
def showcase
@top_five_articles = Article.by_top_votes
end
问题是我无法向DB写出正确的查询,它将:1)找到文章,2)查找每篇文章的所有投票,3)总结相应文章投票的所有值,4)排序他们(这一步我知道该怎么做)。
感谢您的阅读和帮助。
P.S。也许我解决问题的方法几乎是错误的。如果是这样,请告诉我正确的。
答案 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
它起作用,测试正在通过。