Показывать контент только при соблюдении определенных критериев? - PullRequest
1 голос
/ 20 мая 2010

Мне интересно, есть ли лучшая практика для того, чего я пытаюсь достичь ...

Сначала у нас есть модели категорий, категории, сообщения 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

Проблема с этим, я собираюсь показать пустую категорию, а также категории, которые имеют контент.

Есть ли более эффективный способ сделать это? Поскольку я не хочу показывать пустые категории.

Лучший, Эллиот


UPDATE:

Итак, я пытался использовать этот код:

0} .each do | категория | %>

По большей части его почти нет. Проблема в том, что он по-прежнему будет отображать пустую категорию, если в нее вообще были введены какие-либо сообщения (даже если текущий пользователь не вводил сообщения в эту категорию.

Итак, вопрос сводится к:

Как сделать в следующем цикле только количество сообщений в категории от текущего пользователя?

0} .each do | категория | %>

Ответы [ 4 ]

2 голосов
/ 20 мая 2010
<% @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 голос
/ 20 мая 2010

В дополнение к ответу 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, уже отфильтрованную из вашего контроллера, если вы не показываете их где-то еще в своем представлении. Кроме того, если в категории нет сообщений, она не войдет в цикл, поэтому, возможно, выбор не нужен.

0 голосов
/ 20 мая 2010

По моему мнению, у вас должна быть промежуточная таблица для пользователей, которые публикуют сообщения для данной категории, которые могут иметь следующие поля

user_id, post_id, category_id, таким образом, у вас будет таблица с идентификаторами категорий, и для каждой категории есть сообщение.

тогда вы можете сделать следующее

получить различные категории (из таблицы выше) цикл по категориям получать сообщения для этих категорий

** тогда вы не получите ни одной категории без постов

веселит, Самера

0 голосов
/ 20 мая 2010
@categories.select do |category|
  category.posts.any? {|post| post.user == current_user }
end

Будет отфильтровывать категории, чтобы иметь только категории с сообщениями от current_user. Я думаю, это было бы более эффективно делать в БД, используйте это, если вы все равно получаете @categories.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...