Как я могу удалить эту логику с моего взгляда?

StackOverflow https://stackoverflow.com/questions/3798459

  •  05-10-2019
  •  | 
  •  

Вопрос

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

class User < ActiveRecord::Base
has_many :posts
has_many :comments

Посты принадлежат пользователям и имеют много комментариев.

class Post < ActiveRecord::Base
has_many :comments
belongs_to :user

Комментарии принадлежат пользователям и сообщениям

class Comment < ActiveRecord::Base
belongs_to :post
belongs_to :user

В моем посте # Показать представление Я показываю комментарии под сообщением. Я хочу показать имя пользователя, который сделал комментарий. На данный момент у меня есть это на мой взгляд:

<% @post.comments.each do |comment| %>
  <p>
    <b>Commenter:</b>
    <%= link_to  User.find(comment.userid).login, User.find(comment.userid) %>
  </p>

  <p>
    <b>Comment:</b>
    <%= comment.body %>
  </p>
<% end %>

Вероятно, я должен иметь эту логику в моем контроллере. Но я довольно запутался. @ post.comments Возвращает массив (?) комментариев, принадлежащих к посту. Это означает, что я не могу иметь @Commenter = @ post.comments.userid. Я путаюсь по проблеме, чтобы я мог не объяснить это хорошо.

Это было полезно?

Решение

На самом деле во время цикла комментариев вы можете использовать comment.user Чтобы получить данные пользователя, так как вы объявили User has_many Comments отношение.

Другие советы

Чтобы быть более явным на первом ответе, вы просто делаете это:

<%= link_to comment.user, comment.user %>

В вашей модели пользователя переопределите метод to_s, как этот комментарий.user возвращает строку, которую вы хотите:

def to_s
  self.login
end

Наконец, используйте нетерпеливую загрузку, чтобы получить все данные в одном вызове SQL, вместо того, чтобы запросить БД отдельно для каждого комментария. В вашей почтовой модели:

class Post < ActiveRecord::Base
  has_many :comments, :include => :user

А в после контроллере:

def show
  @post = Post.find(params[:id], :include => :comments)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top