Разное принадлежит_ ко многим ассоциациям
Я нашел хорошие ответы здесь, здесь и здесь, но у меня возникли проблемы с обобщением того, что я хочу.
У меня есть несколько категорий, которые будут курировать и выбирать. Таким образом, пользователи смогут выбирать 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, сначала это сложно, но очень хорошо, когда вы получаете это.
Единственное изменение, которое, я думаю, я бы внес в это, кроме собственно именования Item
Post
, будет на вашей модели пользователя:
# app/models/user.rb
class User < ActiveRecord::Base
has_many :posts
has_many :comments
end
Вам не нужна сквозная связь там. Вы могли бы добавить другие комментарии в области видимости, чтобы быть чем-то вроде comments_on_my_posts, through: :posts, class_name: "Comment"
, но для вышеупомянутой связи в комментариях она должна быть прямой (комментарий комментатора <=>).