Должно ли это быть has_many: через ассоциацию? - PullRequest
1 голос
/ 30 марта 2010

Сообщение принадлежит_ пользователю, а пользователь имеет_ множество сообщений.
Сообщение также принадлежит_ Теме, а Тема имеет_Много сообщений.

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: themes.

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

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

Ответы [ 3 ]

3 голосов
/ 30 марта 2010

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

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

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

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

2 голосов
/ 30 марта 2010

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

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

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

2 голосов
/ 30 марта 2010

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

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

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

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

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