weird counter behaviour in has_many :through relationship

The counter is not working as I expected in has_many :through relationship.

I have very simple models. The Article and Pubtype models are in many-to-many relationship, which is stored in the ArticleType model.

Here are the models:

class Article < ActiveRecord::Base   has_many :article_types   has_many :pubtypes, :through => :article_types end

class Pubtype < ActiveRecord::Base   has_many :article_types   has_many :articles, :through => :article_types end

class ArticleType < ActiveRecord::Base   belongs_to :article   belongs_to :pubtype end

Here is the actual schema:

ActiveRecord::Schema.define(:version => 8) do ...   create_table "article_types", :force => true do |t|     t.column "article_id", :integer     t.column "pubtype_id", :integer   end

  create_table "articles", :force => true do |t|     t.column "title", :text   end

  create_table "pubtypes", :force => true do |t|     t.column "title", :string     t.column "articles_count", :integer, :default => 0, :null => false   end ... end

And here is the weird situation ('>>' is irb and '##' is log):

pubtype = Pubtype.find(1)

=> #<Pubtype:0x337a728 @attributes={"title"=>"News", "id"=>"1", "articles_count"=>"1"}>

## Pubtype Load (0.000559) SELECT * FROM pubtypes WHERE (pubtypes.id = 1)

pubtype.articles_count

=> 1

## Article Load (0.008023) SELECT articles.* FROM articles INNER JOIN article_types ON articles.id = article_types.article_id WHERE ((article_types.pubtype_id = 1))

Here, the already loaded "articles_count" attribute value of the pubtype object is not used and a actual select sql was called to count the number of articles that belong to the pubtype. It seems that rails intercepted the method call and did an unnecessary magic.

Is this an intentional behaviour for some good reason?

I'm running on the edge rails.

About your application's environment Ruby version 1.8.5 (i686-darwin8.8.1) RubyGems version 0.9.0 Rails version 1.2.0 Active Record version 1.14.4 Action Pack version 1.12.5 Action Web Service version 1.1.6 Action Mailer version 1.2.5 Active Support version 1.3.1 Edge Rails revision 5717 Application root /Users/joon/Sites/clickstream Environment development Database adapter mysql Database schema version 8

Hi. I dont now how it works in many_to_many models, but if it will be the model one_to_many, i can say, what you forgot the :counter_cahe => true parameter in Article model (if this parameter dont set, the field articles_count doesn't update automatically (in one_to_many models)). Sorry, if it is not your case.

Best Regards, Sergey