Paradigm Shift Design

ISHITOYA Kentaro's blog.

アソシエーションの張り間違いでNameError

ん、railsカテゴリ初投稿。
躓いたところのメモ。


なんか、多対多のアソシエーションを張るときは、has_and_belongs_to_manyを使うらしいんだけど、

class User < ActiveRecord::Base
  has_and_belongs_to_many :contents
end

class Content < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class UsersContents < ActiveRecord::Base
  belongs_to :content
  belongs_to :user
end

と書くらしいのだけれども、名前が気に入らなくて、次のようにしたとき

class User < ActiveRecord::Base
  has_many :contents_submitters
  has_many :contents, :through => :contents_submitters, :source => :contents
end

class Content < ActiveRecord::Base
  has_many :contents_submitters
  has_many :users, :through => :contents_submitters, :source => :users
end

class ContentSubmitters < ActiveRecord::Base
  set_table_name content_submitters
  belongs_to :contents
  belongs_to :users
end

と自力でアソシエーションを張ると、

NameError in EventsController#show 
uninitialized constant Content::Users

というようなエラーが出る。
理由は、わからないが、

class User < ActiveRecord::Base
  has_many :contents_submitters
  has_many :contents, :through => :contents_submitters, :source => :content
end

class Content < ActiveRecord::Base
  has_many :contents_submitters
  has_many :users, :through => :contents_submitters, :source => :user
end

class ContentSubmitters < ActiveRecord::Base
  set_table_name content_submitters
  belongs_to :content
  belongs_to :user
end

と、:sourceとbelongs_toを単数形にすると直る。
ううむ。:sourceで読んでるのがモデル名なのか、Content_Submittersのマイグレーションファイル中にある、外部キーの名前「user_id」のuserなのかはわからないけれど。
このあたり初心者には難しいです。慣れか。