Разное принадлежит_ ко многим ассоциациям

Я нашел хорошие ответы здесь, здесь и здесь, но у меня возникли проблемы с обобщением того, что я хочу.

У меня есть несколько категорий, которые будут курировать и выбирать. Таким образом, пользователи смогут выбирать cat1, cat2 и cat3, но не вводить пользовательскую категорию.

Категория может иметь много постов, пост может иметь много категорий.
Пост может иметь много комментариев.
Пользователь может иметь много сообщений и много комментариев.

Что касается отношений пост / категория, я думаю, что это сработает, но в отношениях пользователь / пост / комментарий я почесываю голову...

# app/models/category.rb
class Category < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

# app/models/post.rb
class Post < ActiveRecord::Base
  has_and_belongs_to_many :categories
  belongs_to :user
  has_many :comments
end

# app/models/user.rb
class User < ActiveRecord::Base
 has_many :posts
 has_many :comments
end

# app/models/comment.rb
class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
end

Это выглядит близко? Нужны ли мне какие-нибудь внешние ключи где-нибудь, чтобы справиться со всем этим? Заранее спасибо, я уверен, что это просто, и мне не хватает чего-то очевидного в моем понимании.

И тогда я должен беспокоиться о том, как написать тесты для всего этого! Это на другой день, хотя...

РЕДАКТИРОВАТЬ: я должен указать, я еще не начал это. Просто попытайтесь наметить это перед тем, как я начну, так что это должно упростить вещи, меньше миграций и т. Д.

ИЗМЕНИТЬ СНОВА: Внедрены предложенные изменения. Спасибо!

2 ответа

Решение

Почему бы не начать с спецификации в первую очередь? это хорошая практика на рельсах со всей мощью, которую вы имеете с rspec

Ваш товар должен называться почтой, почему товар? Есть ли причина? если вы хотите назвать его "Товар", вам нужно указать это в ассоциациях

belongs_to :post, class_name: 'Item'

но вы лучше с Post вместо Item

Комментарий принадлежит пользователю, поэтому у пользователя has_many:comments вам не нужна часть ", through::posts"

has_many :category_posts
has_many :posts, :through => :category_posts #or would has_and_belongs_to_many work better?

это зависит от вас, вам нужно дополнительное поведение на CategoriesPosts? (Категории, во множественном числе), если нет, просто используйте has_and_belongs_to_many

На самом деле, я бы посоветовал вам начать со спецификаций, в итоге вы получите реализацию, не задумываясь об этом, а затем уже протестировали ее, а затем можете добавить больше спецификаций и провести рефакторинг. Прочитайте кое-что о TDD и BDD, сначала это сложно, но очень хорошо, когда вы получаете это.

Единственное изменение, которое, я думаю, я бы внес в это, кроме собственно именования ItemPost, будет на вашей модели пользователя:

# app/models/user.rb
class User < ActiveRecord::Base
 has_many :posts
 has_many :comments
end

Вам не нужна сквозная связь там. Вы могли бы добавить другие комментарии в области видимости, чтобы быть чем-то вроде comments_on_my_posts, through: :posts, class_name: "Comment", но для вышеупомянутой связи в комментариях она должна быть прямой (комментарий комментатора <=>).

Другие вопросы по тегам