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