Rails db查询查找和排序帖子

时间:2013-12-17 20:03:32

标签: ruby-on-rails postgresql ruby-on-rails-4

我的应用程序具有用户可以喜欢的设计(投票,使用acts_as_voteable)。要在视图中查找设计,请使用

@design.votes.count

我正在制作一个热门网页,根据他们的投票数量展示最受欢迎的设计。我只想要对他们至少有5票的设计。现在,我在视图中有这个,但我想将其推入控制器。到目前为止,我的控制器看起来像是显示所有设计并按照大多数投票顺序对它们进行排序。

def popular
  @designs = Design.all
  @designs.sort! {|t1, t2| t2.votes.count <=> t1.votes.count}
end

现在我只想确保设计的最低投票数为5。

以前,我这样做是错误的,并把它放在我的视图中,将它放在我的设计循环中

<% if design.vote.count > 5 %>
  ...
<% end %>

谢谢!

2 个答案:

答案 0 :(得分:4)

首先,您想要的行为在设计模型中更好地定义,而不是在控制器中定义,因为它处理数据。因此,在您的设计模型中,添加以下代码:

scope :most_popular, -> do 
  results = select {|design| design.votes.count > 4 }
  results.sort! {|t1, t2| t2.votes.count <=> t1.votes.count}
end

在您的设计模型中添加上述两种范围方法,您可以在控制器代码中执行此操作:

def popular
  @designs = Design.most_popular
end

您的控制器代码最终变得更加清晰,您可以在任何其他需要的地方重复使用范围方法。 :)

希望有所帮助!

答案 1 :(得分:2)

您可以使用having()子句。请参阅:http://guides.rubyonrails.org/active_record_querying.html#having

例如:Design.joins(:votes).group('votes.design_id')。having('votes.count&gt; 5')。order('votes.count')

修改

您也可以使用where子句。例如,对于第一个设计:

Design.first.votes.where('count&gt; 5')

多种设计的示例:

Design.all.map {| a | a.votes.where('count&gt; 5')。count} .sort! #返回一个包含所有投票计数的排序数组