読者です 読者をやめる 読者になる 読者になる

よしだです

プログラミングの勉強してます

railsのアソシエーションでAssociationTypeMismatchエラーが出てハマった

データベースのリレーションが苦手です。吉田です。

 

railsのアソシエーションで軽くハマったのが解決したので、メモ。

 

今回の原因は命名規則が間違っていてエラーが起こりました。

 

作りたかったのは、ユーザーはたくさんのコミュニティを持っていて、コミュニティもたくさんのユーザーを持っている関係。

そして、コミュニティは一人の管理ユーザーに従属している関係です。

 

とりあえずモデルを作ります。

Userは

id

name

 

Communityは

id

name

admin_user

 

中間テーブルのCommunity_usersに(名前付け間違えました)

user_id

community_id

 

これでUserモデルに

has_many :community_users

has_many :communities, through: :community_users,  source: :community_id

has_many :admin_circles, class_name: "Circle", foreign_key: "admin_user"

 

Community_usersモデルに

belongs_to :user_id, class_name: "User"

belongs_to :community_id, class_name: "Community"

 

Communityモデルに

has_many :community_users

has_many :users, through: :community_users, source: :user_id

belongs_to :admin_user, class_name: "User"

 

これで、僕の予想では

@user.admin_circles.buildみたいにやればadmin_userカラムにユーザーのIDが入った状態でbuild出来ると思ったのですが、タイトルのAssociationTypeMismatchというエラーを吐きました。

 

軽くググると、rails命名規則に適合していないと出てくるエラーらしいので、適合してなさそうな所を探す。

とりあえずCommunityモデルのadmin_userカラムをadmin_user_idに変更して、

Userモデルの

has_many :admin_circles, class_name: "Circle", foreign_key: "admin_user"

has_many :admin_circles, class_name: "Circle", foreign_key: "admin_user_id"

に変更。

 

もう一度@user.admin_circles.buildをやると無事成功。

 

ソースコードとか読んでもうちょっと理解深めたいですな。