2010-06-16 83 views
0

到目前为止,我一直在使用acts_as_taggable_on插件来标记公告。建立模型之间的问题

即插件创建下表:

引用的Tagging:涉及标签和通告表(用于标记物品,它具有一个名为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?因为当我尝试,我得到

未定义的方法'标签

回答

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

你应该尝试@ announcement.tags,因为标签是声明类的一个实例方法(模型)。

@announcement = Announcement.first 
+0

那么,如果我想要获得所有使用特定tag_id标记的公告,该怎么办? – 2010-06-16 15:02:10

+0

'Tag.find(tag_id).announcements' – Chowlett 2010-06-16 15:05:21

+0

这是行不通的。 – 2010-06-16 15:12:52