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>>