问题建立模型之间的关系

时间:2010-06-16 14:52:25

标签: ruby-on-rails

到目前为止,我一直在使用acts_as_taggable_on插件来标记公告。

该插件会创建以下表格:

标记:关联标记和公告表(对于标记项,它有一个名为taggable_id的字段,我将其重命名为“announcement_id”,我将在下面解释)。

标签:具有标签ID和名称。

前几天,我发现我无法使用某个标记标记公告,但是正在执行Announcement.tagged_with(tag_name),我不想按名称搜索,而是搜索id。

因此,由于我几乎没有使用该插件中的任何功能,因此我决定为标记和标记表创建模型,以实现此目的:Announcement.tags

模型的关系如下:

修改

class Tagging < ActiveRecord::Base
  belongs_to :announcement
  belongs_to :tag
end

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :announcements, :through => :taggings
end

class Announcement < ActiveRecord::Base
  has_many :taggings
  has_many :tags, :through => :taggings

为什么我不能执行命令Announcement.tags?因为当我尝试时,我得到了

  

未定义的方法`tags'

2 个答案:

答案 0 :(得分:1)

您实际发布的内容是您尝试Announcement.tags。但是tags将是Announcement实例上的一种方法,并且它将其称为Announcement类上的方法,这将无效。

假设您实际上正在呼叫an_announce.tags,您还需要AnnouncementTag才能拥有多个taggings - 就像这样:

class Announcement < ActiveRecord::Base
  has_many :taggings
  has_many :tags, :through => :taggings
end

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :announcements, :through => :taggings
end

答案 1 :(得分:1)

你应该试试@ announcement.tags,因为tags是Announcement类(模型)的实例方法。

@announcement = Announcement.first