Вопрос

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

class User < ActiveRecord::Base
  has_many :posts
end

class Topic < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
   belongs_to :user
   belongs_to :topic
end

Что ж, это довольно просто и очень легко настроить, но когда я показываю Тему, мне нужны не только все записи по этой теме, но также имя пользователя и пользовательское фото Пользователя, сделавшего эту запись.Однако эти атрибуты хранятся в пользовательской модели и не привязаны к Теме.Итак, как бы мне это настроить?

Может быть, это уже можно вызвать, поскольку модель Post имеет два внешних ключа, один для пользователя и один для темы?

Или, может быть, это какой-то "односторонний" has_many через ассоциацию.Например, Сообщение было бы моделью объединения, а тема была бы has_many :users , :through => :posts .Но обратное этому неверно.Как у Пользователя НЕТ has_many :topics.

Так должно ли это вообще быть ассоциацией has_many : though?Я думаю, я просто немного запутался в том, как будет выглядеть контроллер, вызывающий как Сообщение, так и Пользователя этого сообщения для заданной темы.

Редактировать:Серьезно, спасибо всем, кто принял участие.Я выбрал ответ тэла, потому что использовал его код для своего контроллера;однако я мог бы с таким же успехом выбрать вместо этого либо Дж., либо Тима.Я также благодарю вас обоих.Это было так чертовски просто реализовать.Я думаю, что сегодняшний день может ознаменовать начало моего любовного романа с rails.

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

Решение

Ну, если вы хотите, например, отобразить имя пользователя автора сообщения, вы можете сделать что-то вроде (не тестировалось, но должно сработать) :

@posts = topic.posts.all(:include => :user) 

он должен сгенерировать один запрос для всех записей и один для пользователей, а в коллекции записей должны быть пользователи.

в представлении (haml здесь) :

- @posts.each do |post|
  = post.user.name
  = post.body

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

вы можете получить user_name и user_photo при отображении темы и ее сообщений...

что - то вроде:

@topic.posts.each do |post|
   user_name = post.user.name
   user_photo = post.user.photo
end

это очень просто.извините, если я не очень хорошо понял ваш вопрос.

Если я правильно понимаю ваш вопрос, нет, ассоциация has_many :through здесь не требуется.

Если бы вы хотели отобразить список всех пользователей, разместивших сообщения в теме (пропустив информацию о публикации), то это было бы полезно.

Однако вам захочется быстро загружать пользователей из сообщений, чтобы предотвратить n + 1 запросов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top