我应该如何设置一个应用程序,模型之间只有轻微的变化?

时间:2011-07-08 04:15:16

标签: ruby-on-rails ruby ruby-on-rails-3

我在Rails中创建一个论坛,传统的Topic设置了很多Posts

然而,该论坛围绕着一个由用户播放的论坛游戏,这些游戏几乎都是用户通过轮流发布来玩游戏的主题。

为了对我的应用程序进行原型设计,我创建了这些模型:

Topic has many Posts
Game has many GamePosts
InterestCheck has many InterestCheckPost

工作原理:

  • 用户在查找游戏子论坛中创建一个InterestCheck。
  • 当他们找到感兴趣的玩家时,他们会在游戏子论坛中开始游戏。
  • 一般性讨论,新闻公告和其他常规留言板的使用都被纳入主题

我为Games和InterestChecks创建新模型的原因是因为我想为它们添加特定的元数据。例如,游戏可以用各种标签标记,而主题则不能。

但它显然非常丑陋和重复,因为我正在为Games和InterestChecks重新创建相同的Topic has many Posts场景。它创造了一些非常丑陋的路线,如new_game_game_post_path

问题

现在,我一直坚持如何实现这一点。主题,游戏和兴趣检查都具有相同的主题/帖子功能,但我想确保我可以在Games和InterestChecks上扩展和添加元数据,这就是为什么STI看起来不像解决方案,除非我是错误的。

1 个答案:

答案 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:stringpostable_id:integer添加到Post表中。或者您可以在Post迁移中仅使用t.references :postable, :polymorphic => true完成相同操作,它会为您添加列。

我没有测试过这个。