#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
это было неуместно.