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

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

首先,我们有模型类别,类别,has_manypost。

现在让我们说,用户添加post。


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


假设我们有以下类别: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 | %>

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

所以问题归结为:

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

0} .each do | category | %>

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

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

除了zetetic的答案之外,或许在给定类别中查找用户的post将以相反的方式完成。 而不是查询“作者是当前用户的类别的所有post”,而不是要求“用户在给定类别中的所有post”

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

并抛出一个范围搜索User#posts_in_category

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

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

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

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

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

那么你可以做到以下几点

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

**那么没有post你就不会得到任何类别

欢呼声,同样的