Правильно ли настроены мои ассоциации ActiveRecord? (простое приложение для доски объявлений)

#ruby-on-rails #ruby #activerecord #associations #models

#ruby-on-rails #ruby #activerecord #ассоциации #Модели

Вопрос:

В принципе, я хочу, чтобы в теме было много сообщений, а в сообщениях — много комментариев. Если сообщение уничтожается, я хочу, чтобы его комментарии были уничтожены. Если тема удалена, я хочу, чтобы ее сообщения и комментарии были уничтожены. Выполняет ли это приведенный ниже код? И нужна ли has_one :topic строка?

topic.rb:

 class Topic < ActiveRecord::Base
  has_many :posts, :dependent => :destroy
end
  

post.rb:

 class Post < ActiveRecord::Base
  belongs_to :topic, :dependent => :destroy, :touch => true
  has_one    :topic
  has_many   :comments, :dependent => :destroy
end
  

комментарий.rb:

 class Comment < ActiveRecord::Base
  belongs_to :post, :dependent => :destroy, :touch => true
end
  

Должен ли я использовать Ancestry gem для этого? Сделало бы это еще проще? Спасибо, что прочитали мои вопросы. Буду признателен за любую помощь.

Ответ №1:

1) has_one :topic не требуется, поскольку belongs_to вы уже объявили ассоциацию.

2) :dependent => :destroy выполняется на стороне has_many для ваших требований. Если вы разместите их на стороне belongs_to, вы уничтожите тему, однажды уничтожив один из его постов, оставив сиротой множество других постов.

Это код, который вы ищете:

topic.rb:

 class Topic < ActiveRecord::Base
  has_many :posts, :dependent => :destroy
end
  

post.rb:

 class Post < ActiveRecord::Base
  belongs_to :topic, :touch => true
  has_many   :comments, :dependent => :destroy
end
  

комментарий.rb:

 class Comment < ActiveRecord::Base
  belongs_to :post, :touch => true
end
  

Комментарии:

1. Большое вам спасибо. У меня было ощущение, что has_one это было ненужно, но я понятия не имел, что :dependent => :destroy это было неуместно.