是这样的,假设应用系统里有 电影(Movie),音乐(Music),图片(Image)这三个模型
而这三个模型都需要分类的支持 可能就会需要 MovieCategory,MusicCategory,ImageCategory 这三个分类模型
Movie belongs_to MovieCategory Music belongs_to MusicCategory Image belongs_to ImageCategory
但是 MovieCategory、MusicCategory、ImageCategory 这三个里面肯定有很多重复的代码。
所以希望系统可以只用一个 Category 模型代替 MovieCategory、MusicCategory、ImageCategory 这三个模型
这样就可以变成: Movie belongs_to Category Music belongs_to Category Image belongs_to Category
这样的话,应该如何设计 Category 的数据结构呢? 另外如果想取出 Movie 的所有分类应该如何编码可以显得比较美一些?
感覺你需要的,如果不是 5 樓提到的 polymorphic association,大概就是 STI 了吧?http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Single+table+inheritance
#5 楼 @thisiskun 感觉不是用 polymorphic association 实现,因为并不是 category belongs_to movie
思路: 1, Categorizable (Music, Movie) 与 Category 是多对多关系, 2, Category knows nothing about Categorizable, the connections between "Categorizable" and "Category" are made by a table named "Categorization"
偶觉得有时候打标签比用分类更方便,大不了一个标签代表一个分类,以后还可以扩展同时属于多个分类 gem acts as taggable on 如果自己做,也可以参见插件的源代码
#10 楼 @leomayleomay 那假如想列出 Movie 的所有分类应该如何写呢? 包括空的分类(就是还没有分类给某个 @movie 的分类----空分类)
@wuwx 你可以看一下 acts_as_taggable 的模型结构 他是 tag -> tagging <- tagger 的结构,我在上一个项目中就用借用了他的代码,再打了几个 patch,把 string basis 改成了 id basis, 其代码主要是在 core 模块中。你用 ActsAsTaggableOn::Tag.all 就能获得全部的 categories,然后就是 scope... 你也能自己通过搭多对多来做。道理和结构都是一样的。
用 polymorphic http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
不过我也觉得用 tag 比较合适,不过这个 categories 可以作为节点