Должно ли это вообще быть ассоциацией has_many :through?
-
23-09-2019 - |
Вопрос
Сообщение принадлежит Пользователю, а у Пользователя есть_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 запросов.