Witam wszystkich,
Dopiero zaczynam zabawę a Rails i jak na razie bardzo mi się podoba. Uczę się z dokumentacji i artykułów w sieci, więc są pewne problemy, ale cały czas idę do przodu.
Ostatnio zacząłem bawić się relacjami, wczoraj napisałem sobie ręcznie wywalanie rekordu z modelu wskazywanego przez :through, po czym przeczytałem o istnieniu :dependent=> :destroy i postanowiłem zrobić to właśnie tak, żeby było po railsowemu:
Modele
[code]class Category < ActiveRecord::Base
has_many :categorizations
has_many :articles, :through => :categorizations, :dependent => :destroy
class Article < ActiveRecord::Base
belongs_to :user, :foreign_key => “author_id”, :class_name=>“User”
has_many :categorizations
has_many :categories, :through => :categorizations, :dependent => :destroy
validates_length_of :title, :within => 3…100
validates_length_of :body, :minimum => 10
class Categorization < ActiveRecord::Base
belongs_to :category
belongs_to :article[/code]
I teraz przy edycji artykułu, usuwa dotychczasowe kategorie i na podstawie formularza tworzy nowe:
for category in @article.categories
category.destroy
end
if params[:cats]
for category in params[:cats]
cat = Categorization.new(:article_id => @article.id, :category_id => category)
cat.save
end
end
Myślałem, że wraz z usuwanie każdej article.categories będzie zgodnie z :dependent usuwana również odpowiadająca jej kategoryzacja. Tymczasem jest błąd, wygląda na to, że sql’owski:
SystemStackError: stack level too deep: SELECT articles.* FROM articles INNER JOIN categorizations ON articles.id = categorizations.article_id
WHERE ((categorizations.category_id = 1))
Pytanie co jest nie tak? Jak powinny wyglądać modele i akcja w kontrolerze, aby to działało.