ページ

2011年10月10日月曜日

Railsメモ:多対多の関連を利用したときにNameError: uninitialized constant

多対多の関連を設定したんだけど、データの読み出しがうまくいかない・・・

ソースはこんな感じ。

[root@localhost memoru]# cat app/models/memo.rb
class Memo < ActiveRecord::Base
        has_many :memos_tags
        has_many :tags, :through => :memos_tags
        validates_presence_of :body
end
[root@localhost memoru]# cat app/models/tag.rb
class Tag < ActiveRecord::Base
        has_many :memos_tags
        has_many :memos, :through => :memos_tags
end
[root@localhost memoru]# cat app/models/memos_tags.rb
class MemosTags < ActiveRecord::Base
        belongs_to :memo
        belongs_to :tag
end

こうすれば、DBにデータを登録したのち、
Memo.first.tags
と記述することで、memoに関連するすべてのtagを取得できるはずなんだけど、
NameError: uninitialized constant Tag::MemosTag
というエラーがでてしまう。

もしかして、関連テーブルとして使用しているMemosTagsモデルの名前が悪いのかな。
モデル名を単数系にしてみよう。
memoモデルとtagモデルの中の、has_manyの引数も修正して、こんな感じにしてみた。
[root@localhost memoru]# cat app/models/memo.rb
class Memo < ActiveRecord::Base
        has_many :memo_tag_relations
        has_many :tags, :through => :memo_tag_relations
        validates_presence_of :body
end
[root@localhost memoru]# cat app/models/tag.rb
class Tag < ActiveRecord::Base
        has_many :memo_tag_relations
        has_many :memos, :through => :memo_tag_relations
end
[root@localhost memoru]# cat app/models/memo_tag_relation.rb
class MemoTagRelation < ActiveRecord::Base
        belongs_to :memo
        belongs_to :tag
end

今度は、
Memo.first.tags
で期待する結果を得ることができた。

モデルの名前は単数系にするべきだという、Railsの規約を守っていなかっただけなのね。
とほほ。

0 件のコメント:

コメントを投稿