【问题标题】:Hacker News rails clone: advice on modeling relationship between links, comments and votesHacker News rails clone:关于链接、评论和投票之间关系建模的建议
【发布时间】:2011-07-06 21:07:01
【问题描述】:

我很喜欢 Rails,但我们才刚刚开始约会。

用户可以对链接和 cmets 进行投票。除了主键和时间戳之外,我目前还为这些模型定义了以下属性:

  • 链接 url、标题、submitter_id、分数
  • 评论内容、commenter_id、score、link_id、parent_comment_id
  • 投票 id、voter_id、link_id、方向

我刚刚添加了评论模型,并考虑了如何将它与投票相结合。一些选项:

  1. 将链接和 cmets 折叠成一个“Item”模型,并将投票映射到通用 item_id
  2. 有两个投票表,一个用于 cmets,一个用于链接
  3. 将comment_id 列添加到现有投票表

不确定什么是最好的。 #1 和 #3 引入了两用表,即表中的某些列仅与该表中的行子集相关。 #2 避免了这个问题,但显得多余和愚蠢。

权衡是不可避免的还是我没有看到黄金之路?你会推荐什么?如果您碰巧知道 github 上有一个处理类似情况的 rails 存储库,我非常感谢您提供链接!

【问题讨论】:

  • 作为旁注,不要使用外键作为 voter_id、commenter_id.... 但是外表名 (user_id) 这就是惯例,如果你这样做,Rails 不会选择它up,你必须指定它
  • 最小的指定工作似乎值得提交者、投票者、评论者与通用“用户”三者的可读性增益。但也许我应该走“用户”路线,只是为了可读性而编写包装器/别名方法?
  • 您始终可以在您的模型中执行以下操作:belongs_to :commenter, :class_name => 'User',您将能够保持代码的可读性和架构标准化。
  • 是的,这就是我正在做的。抱歉,如果不清楚。

标签: ruby-on-rails database-design data-modeling


【解决方案1】:

我认为您正在寻找的是多态关联。在您的情况下,就像这样简单:

class Vote < ActiveRecord::Base
  belongs_to :votable, :polymorphic => true
end

class Link < ActiveRecord::Base
  has_many :votes, :as => :votable
end

class Comment < ActiveRecord::Base
  has_many :votes, :as => :votable
  #...
end

您的投票表应如下所示:

id           : integer
votable_id   : integer 
votable_type : string # Comment || Link

这里有一个关于它的 Railscast:Polymorphic Associations Railscast

【讨论】:

  • 这看起来很有希望,谢谢!现在研究它,一旦我理解它就会回来检查答案。
  • 好的,视频播放 1 分钟,很明显你一针见血。非常感谢!
猜你喜欢
  • 2011-07-16
  • 2010-12-14
  • 2018-10-27
  • 2012-05-11
  • 2019-07-04
  • 1970-01-01
  • 2014-03-15
  • 2011-04-21
  • 1970-01-01
相关资源
最近更新 更多