我有Post
,Reply
和Vote
模型(多态):
create_table "posts", :force => true do |t|
t.text "content", :limit => 255
t.integer "user_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.string "title"
t.integer "replies_count", :default => 0, :null => false
t.integer "category_id"
end
create_table "replies", :force => true do |t|
t.text "content"
t.integer "post_id"
t.integer "user_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "votes", :force => true do |t|
t.integer "votable_id"
t.string "votable_type"
t.integer "user_id"
t.integer "polarity"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
我需要total_votes
个帖子和回复,所以我创建了一个实例方法:
post.rb和reply.rb:
def total_votes
self.votes.map {|v| v.polarity }.sum
end
所以我可以用它来对帖子和回复进行排序:
主页:
default_order = "created_at DESC"
params[:order_by] ||= default_order
@feed_items = @post.replies.paginate(page: params[:page],
per_page: 10).order(params[:order_by])
现在,我不太确定视图中order_by
后添加的内容:
<span><%= link_to 'total_votes DESC', root_path(order_by: HERE) %></span>
我尝试了&:total_votes DESC
和total_votes DESC
,但没有成功。
这样做的正确方法是什么? (我认为在total_votes
和posts
表中添加replies
列有点不必要,但不确定这对性能是否更好?)
答案 0 :(得分:2)
我首先要使用数据库为你做总结,但这有点棘手,因为你需要按计算的值(“聚合”)进行排序,但是让我们把它放在一边。
您的视图将按照在控制器中设置实例变量时确定的顺序显示项目。因此,在控制器中,您可能会检测到order_by
参数(例如/feed?order_by=total_votes
),并相应地加载@feed_items
,例如
def index
if params[:order_by] && params[:order_by] == 'total_votes'
sort_order = "total_votes DESC"
else
sort_order = "created_at DESC"
end
@feed_items = @post.replies.paginate(page: params[:page],
per_page: 10).order(sort_order)
end
然后在您的视图中,更改排序顺序,创建一个添加查询字符串参数的link_to
(请参阅the link_to api doc中的最后一个示例,例如
<%= link_to "Sort by Total Votes", root_path(:order_by => 'total_votes') %><br />
<%= link_to "Sort by Time", root_path %><br />
您的另一个问题是如何通过投票进行排序。这个答案可以为此提供一个良好的开端,并回答您的表现问题:Rails: Order by sum of two columns