Rails ассоциации пользователя / поста / комментария - PullRequest
5 голосов
/ 07 февраля 2011

Я пытаюсь создать приложение, подобное блогу, с 3 моделями: пользователь, пост и комментарий. Как и ожидалось, комментарий принадлежит как пользователю, так и сообщению.

Я использовал следующие ассоциации:

User.rb

has_many :comments
has_many :posts

post.rb

has_many :comments
belongs_to :user

Comment.rb

belongs_to :user
belongs_to :post

И я попытался создать комментарии, используя: @ User.comments.create

Однако это будет связано с комментарием пользователя, но не с сообщением. Я хочу, чтобы комментарий был связан как с пользователем, так и с постом. Есть ли способ сделать это? Или я использовал неправильные ассоциации?

Я думаю, что было бы плохой практикой устанавливать user_id или post_id вручную, поэтому оба идентификатора отсутствуют в attr_accessible. Я не уверен, правильно ли это.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 07 февраля 2011

Вам не нужно специально устанавливать post_id. Попробуйте @user.comments.create(:post => @post).

0 голосов
/ 07 февраля 2011

Если комментарий должен быть связан с более чем одной моделью, мы называем его polymorphic association.Вы можете взглянуть на плагин has_many_polymorphs для этого.Я предполагаю, что вы используете рельсы 3, вы можете попробовать следующее:

Вы можете задать модуль в папке lib/commentable.rb следующим образом:

module Commentable
    def self.included(base)
        base.class_eval do
            has_many :comments, :as => commentable
        end
    end
end

В модели комментариев вы должны сказатьчто он полиморфный:

belongs_to :commentable, :polymorphic => true

В моделях Post и User можно добавить следующее:

has_many :comments, :as => :commentable, :dependent => :delete_all

Поскольку в Rails 3 папка lib по умолчанию не загружается, выдолжен попросить Rails загрузить это в ваш application.rb:

config.autoload_paths += %W(#{config.root}/lib)

Теперь, Comment является полиморфным, и с ним может быть связана любая другая модель.Это должно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...