Rails Acts_as_tree and many to many associations (Product, Category) Issue

Hi,

I want to create simple many to many association between my product and category model. Category model currently also acts_as_tree for navigation. The code works fine but not sure why after updating product categories, parent category is also inserted repeatedly. This is surprising because new record in my join model is repeating with parent category every few minutes. here are my model code

class Category < ActiveRecord::Base   acts_as_tree :order => 'name'

  has_many :categorizations, :dependent => :destroy   has_many :products, :through => :categorizations end

class Product < ActiveRecord::Base   has_many :categorizations, :dependent => :destroy   has_many :categories, :through => :categorizations end

class Categorization < ActiveRecord::Base   belongs_to :product   belongs_to :category end

I'm also pasting relevant fields from the schema to give more contexts create_table "categories", :force => true do |t|     t.integer "parent_id"     t.string "name"     t.datetime "created_at"     t.datetime "updated_at" end

create_table "categorizations", :force => true do |t|     t.integer "product_id"     t.integer "category_id"     t.datetime "created_at"     t.datetime "updated_at"   end

Any help is appreciated. Just to reiterate category assignment works but after some times, parent category of the assigned category is inserted repeatedly.

Hey Anshu,

Taking a look at the code you posted, I don't know for sure why it would be repeating every so often, but you could try adding a unique index on the categories table to force the database to "break" when a duplicate is inserted. Obviously you might not want to do this with production code, but if you can duplicate it in a test environment, making it break would likely give you a stack trace you could use to pinpoint the problem.

You could also add a check for uniqueness on the model:

class Category < ActiveRecord::Base   validates :name, :unique => true, :presence => true # Rails 3   # Rails 2.x   # validates_uniqueness_of :name end

Another possibility that occurs to me is that MAYBE character codes being inserted aren't quite uniform. For example, if you have a browser set to send information using UTF-8, and I have a browser set to send POST data as ASCII, there might be similar symbols with different character codes that the database or the Ruby interpreter is looking at saying, "these are different" even though they're the same symbol. This is a remote possibility and probably not quite 100% correct, and I'm sure some one can offer more information on this point than I, as I don't really deal with "foreign" character sets that often, but it may be something to look into.

Nonetheless, if you specify the encoding type in your database for all tables (UTF-8 would probably be the way to go depending on your needs) and a unique index on the columns that repeat, you can *probably* get it to break and show you some information that may help you track it down.

Another possibility to help figure it out would be writing some quick unit tests to validate that information isn't being repeated, then running those tests. If they pass (and certify that information isn't being repeated), I'd think it more likely that something like the character encoding issue I mentioned above might be going on.

I wish I could be of more assistance. Good luck to you!

Hi Phoenix Rising,

Thanks for looking at my issue. I have UTF encoding for my databases and also for the rails app.

My hunch is that it got to do something with category table having parent_id for acts_as_tree plugin requirement. Every time, I add a children of root category the root category gets added itself. It then repeats. This is surprising and I have never experienced like this before.

As a temp work around I have added has_many :products, :through => :categorizations, :uniq => true but it won't solve the problem root category getting inserted themselves but should avoid multiple insertions. Note category 45 was assigned but after some time parents adds itself repeatedly.

Here is sample of insertion #<Category id: 45, parent_id: 12, name: "Books", description: "", created_at: "2011-02-21 08:08:17", updated_at: "2011-02-21 08:08:17", permalink: "books">, #<Category id: 12, parent_id: 11, name: "Kids", description: "", created_at: "2010-09-16 23:28:06", updated_at: "2011-01-05 11:17:10", permalink: "kids">, #<Category id: 12, parent_id: 11, name: "Kids", description: "", created_at: "2010-09-16 23:28:06", updated_at: "2011-01-05 11:17:10", permalink: "kids">, #<Category id: 12, parent_id: 11, name: "Kids", description: "", created_at: "2010-09-16 23:28:06", updated_at: "2011-01-05 11:17:10", permalink: "kids">, #<Category id: 12, parent_id: 11, name: "Kids", description: ""