ソースはこんな感じ。
[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 件のコメント:
コメントを投稿