我在Rails中创建一个论坛,传统的Topic
设置了很多Posts
。
然而,该论坛围绕着一个由用户播放的论坛游戏,这些游戏几乎都是用户通过轮流发布来玩游戏的主题。
为了对我的应用程序进行原型设计,我创建了这些模型:
Topic has many Posts
Game has many GamePosts
InterestCheck has many InterestCheckPost
工作原理:
我为Games和InterestChecks创建新模型的原因是因为我想为它们添加特定的元数据。例如,游戏可以用各种标签标记,而主题则不能。
但它显然非常丑陋和重复,因为我正在为Games和InterestChecks重新创建相同的Topic has many Posts
场景。它创造了一些非常丑陋的路线,如new_game_game_post_path
。
问题
现在,我一直坚持如何实现这一点。主题,游戏和兴趣检查都具有相同的主题/帖子功能,但我想确保我可以在Games和InterestChecks上扩展和添加元数据,这就是为什么STI看起来不像解决方案,除非我是错误的。
答案 0 :(得分:0)
您应该可以使用单表继承和多态关联来执行此操作。
Rails本身支持的单表继承将允许您只有一个可以继承Games&InterestChecks的Topics表。
您的主题模型将如下所示:
class Topic < ActiveRecord::Base
...
end
class Game < Topic
...
end
class InterestCheck < Topic
...
end
只需在主题表中添加type
列即可。例如,Game.all
实际上只是Topic.where(:type => 'game')
。
多态关联会让所有Topic模型访问同一个Post表。
您的帖子模型将如下所示:
class Post < ActiveRecord::Base
belongs_to :postable, :polymorphic => true
...
end
您在主题模型中支持:
class Topic < ActiveRecord::Base
has_many :posts, :as => :postable
end
您需要将postable_type:string
和postable_id:integer
添加到Post表中。或者您可以在Post迁移中仅使用t.references :postable, :polymorphic => true
完成相同操作,它会为您添加列。
我没有测试过这个。