Как я могу удалить эту логику с моего взгляда?
-
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)