Hi all,
I am trying to create many-to-many relationship between models "Topic" and "Category"
I am trying following in rails console which gives me exception.
t1 = Topic.new(:title => "t1") c1 = Category.new(:name => "c1") t1.categories << c1 t1.save
Gives Exception........
Am I doing something really wrong?
Thanks, Siddharth
Here is my Topic model class Topic < ActiveRecord::Base has_and_belongs_to_many :categories, :class_name => "Category", :join_table => "topics_categories", :association_foreign_key => "category_id", :foreign_key => "topic_id", :after_add => :add_topic_to_category, :after_remove => :remove_topic_from_category
def add_topic_to_category(category) category.topics << self unless category.topics.include?(self) end def remove_topic_from_category(category) category.topics.delete(self) rescue nil end end
and Category class Category < ActiveRecord::Base has_and_belongs_to_many :topics, :class_name => "Topic", :join_table => "topics_categories", :association_foreign_key => "topic_id", :foreign_key => "category_id" end
and topics_categories table create table topics_categories ( topic_id bigint, category_id bigint );
Full stack trace Loading development environment.
t1 = Topic.new(:title => "t1")
=> #<Topic:0xb766da88 @new_record=true, @attributes={"created_on"=>nil, "num_comments"=>nil, "title"=>"t1", "updated_on"=>nil, "url"=>"", "blocked"=>0, "description"=>"", "user_id"=>nil, "num_views"=>nil}>
c1 = Category.new(:name => "c1")
=> #<Category:0xb7614cd0 @new_record=true, @attributes={"name"=>"c1", "blocked"=>0, "description"=>"", "usage_count"=>nil}>
t1.categories << c1
=> [#<Category:0xb7614cd0 @topics=[#<Topic:0xb766da88 @categories=[...], @new_record=true, @attributes={"created_on"=>nil, "num_comments"=>nil, "title"=>"t1", "updated_on"=>nil, "url"=>"", "blocked"=>0, "description"=>"", "user_id"=>nil, "num_views"=>nil}>], @new_record=true, @attributes={"name"=>"c1", "blocked"=>0, "description"=>"", "usage_count"=>nil}>]
t1.save
SystemStackError: stack level too deep from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations.rb:912:in `validate_associated_records_for_categories' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:802:in `run_validations' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:800:in `run_validations' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:764:in `valid_without_callbacks' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/callbacks.rb:310:in `valid?' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations.rb:918:in `validate_associated_records_for_topics' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations/association_proxy.rb:110:in `method_missing' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations/has_and_belongs_to_many_association.rb:81:in `method_missing' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations.rb:913:in `validate_associated_records_for_topics' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:802:in `run_validations' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:800:in `run_validations' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:764:in `valid_without_callbacks' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/callbacks.rb:310:in `valid?' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations.rb:918:in `validate_associated_records_for_categories' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations/association_proxy.rb:110:in `method_missing' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations/has_and_belongs_to_many_association.rb:81:in `method_missing' ... 2796 levels... from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/callbacks.rb:310:in `valid?' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations.rb:918:in `validate_associated_records_for_categories' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations/association_proxy.rb:110:in `method_missing' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations/has_and_belongs_to_many_association.rb:81:in `method_missing' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/associations.rb:913:in `validate_associated_records_for_categories' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:802:in `run_validations' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:800:in `run_validations' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:764:in `valid_without_callbacks' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/callbacks.rb:310:in `valid?' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb:735:in `save_without_transactions' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/transactions.rb:126:in `save' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_adapters/abstract/database_statements.rb:51:in `transaction' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/transactions.rb:91:in `transaction' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/transactions.rb:118:in `transaction' from /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/transactions.rb:126:in `save' from (irb):4>>