Получить все посты, где прокомментировал данный пользователь - PullRequest
2 голосов
/ 23 октября 2010

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

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

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

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

На странице пользователя (например, http://host/users/1) Я хочу показать все сообщения, где данный пользователь прокомментировал.Каждый пост будет иметь все остальные комментарии.

Я могу сделать что-то подобное в моем контроллере пользователя:

def show
  @user = User.find(params[:user_id])
  @posts = []
  user.comments.each {|comment| @posts << comment.post}
end

Таким образом я найду пользователя, затем все его комментарии, затем соответствующую запись для каждого комментария, а затем (в моемview) для каждого поста я буду рендерить post.comments.Я полностью новичок в Rails, так что я могу сделать это =) Но я думаю, что это как-то плохо, и есть лучший способ сделать это, может быть, я должен использовать области или named_scopes (пока не знаю, что это такое, но выглядитстрашно).

Так вы можете указать мне правильное направление здесь?

Ответы [ 2 ]

5 голосов
/ 23 октября 2010

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

class User < ActiveRecord::Base
  has_many :posts_with_comments, :through => :comments, :source => :post
  # ...
end

:through - это опция для has_many для указания таблицы соединениячерез который выполнить запрос.Нам нужно указать :source, так как Rails не сможет вывести источник из :post_with_comments.

Наконец, обновите контроллер для использования ассоциации.

def show
  @user  = User.find(params[:user_id])
  @posts = @user.posts_with_comments
end

Чтобы узнать больше о :through и :source, ознакомьтесь с документацией .

0 голосов
/ 23 октября 2010

Когда вы получили пользователя, у вас есть ассоциации к его сообщениям, и у каждого сообщения есть свои комментарии. Вы могли бы написать: (Я не знаю имен полей вашей таблицы, поэтому я назвал текстовый текст)

# In Controller
@user = User.find(params[:user_id]).include([:posts, :comments])

# In View
@user.posts.each do |post|
  post.text
  # Comments to the Post
  post.comments.each do |comment|
    comment.text
  end
end

Я не проверял код, поэтому могут быть некоторые ошибки.

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