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をやると無事成功。
ソースコードとか読んでもうちょっと理解深めたいですな。