仅在满足特定条件时显示内容?

时间:2010-05-20 02:16:00

标签: ruby-on-rails

我想知道这是否是我想要完成的最佳实践......

首先我们有模型类别,类别,has_many帖子。

现在让我们假设用户添加帖子。


现在,我有一个页面,我想按类别仅显示当前用户的帖子。


假设我们有以下类别:A,B和C

用户1已发布在类别A和B中。


在我看来,我有类似的东西:

@categories.each do |category|

   category.name

   @posts.each do |post|
   if post.category_id==category.id

     post content here

    end
    end


end

问题在于,我将展示空类别以及具有内容的类别。

有没有更有效的方法来解决这个问题?因为我不想显示空的类别。

最佳, 埃利奥特


更新:

所以我一直在尝试使用这段代码:

 0} .each do | category | %GT;   
       
  

在大多数情况下,它几乎就在那里。问题是,如果在其中输入任何帖子,它仍然会显示一个空类别(即使当前用户没有在该类别中输入帖子。

所以问题归结为:

如何使以下循环仅计算当前用户的类别中的帖子?

 0} .each do | category | %GT;

4 个答案:

答案 0 :(得分:2)

<% @categories.select {|cat| cat.posts.count > 0}.each do |category| %>
  <%= category.name %><br/>
  <% category.posts.select {|post| post.user == current_user}.each do |post| %>
    <%= post.content %><br/>
  <% end %>
<% end %>

这会为每个类别呈现任何帖子,然后呈现属于当前用户的类别中每个帖子的内容。您可能希望在控制器中进行初始选择,以保持视图清洁。

答案 1 :(得分:1)

添加到zetetic的答案,也许以相反的方式查找给定类别中用户的帖子。而不是查询“作者是当前用户的类别的所有帖子”,而是要求“用户在给定类别中的所有帖子”

<% @categories.select {|cat| cat.posts.count > 0}.each do |category| %>
  <%= category.name %><br/>
  <% current_user.posts_in_category(category).each do |post| %>
    <%= post.content %><br/>
  <% end %>
<% end %>

并抛出范围搜索User#posts_in_category

编辑:如果您没有在视图中的其他位置显示@categories变量,也可以设置已从控制器中过滤的@categories变量。此外,如果类别没有帖子,则不会进入周期,因此可能不需要选择。

答案 2 :(得分:0)

@categories.select do |category|
  category.posts.any? {|post| post.user == current_user }
end

将过滤掉类别,使其只包含current_user的帖子类别。我想在数据库中执行此操作会更有效,如果您正在获取@categories,请使用此选项。

答案 3 :(得分:0)

根据我的关注,您需要为发布给定类别的帖子的用户提供一个中间表,该表可能包含以下字段

user_id,post_id,category_id通过这种方式,您将拥有一个具有类别ID的表,并且每个类别都有一个帖子。

然后你可以做以下

获取不同的类别(从上表) 循环通过类别 获取这些类别的帖子

**那么你不会在没有帖子的情况下得到任何类别

欢呼声, sameera