【问题标题】:In Class Table Inheritance, how to have parent and child use the same id?在类表继承中,如何让父母和孩子使用相同的id?
【发布时间】:2012-03-06 03:21:53
【问题描述】:

我有两个课程:TopicBuy::Topic。后者是前者的子类,通过外键 (Buy::Topic.topic_id == Topic.id)。所以本质上这是使用类表继承模式。

Buy::Topic 有自己的id 和指向父Topic 对象的外键topic_id

但是我想确保Buy::Topic 的 id 与父级的topic_id 相同,如下所示:

#<Topic id: 22598>#<Buy::Topic id: 22598, topic_id:22598

这在 Rails 中可行吗?这对于 SEO 来说更好,并且可以更轻松地处理 Cancan 的 load_and_authorize_resource(有时 cancan 使用两者的错误 id 来查找内容)。

UDPATE:

这个架构已经设置和完成了很长时间,所以现在不太可能将其更改为 STI。

【问题讨论】:

  • 如果您希望 id 匹配,感觉 STI 会是更好的选择。您始终可以将 Buy::Topic 定义为 Topic 的特例...
  • 是的,我想了一下,原因是子类的其他字段太多了。
  • ...这很糟糕,因为?引用 Knuth 的话“过早的优化是万恶之源”。存储空间便宜得离谱。如果您的核心要求是 SEO 的“让 id 保持不变”,那么请针对此进行优化,而不是针对存储进行优化。

标签: ruby-on-rails ruby-on-rails-3 inheritance activerecord class-table-inheritance


【解决方案1】:

这样做会主动破坏您的 CTI,甚至可能创建反模式!

我的论点是,如果,

Buy::Topic.id == Buy::Topic.topic_id == Topic.id

然后您在 Buy::Topic 和 Topic 之间创建一对一的关系。

这意味着没有其他类可以由Buy::Topic 组成,因为id 可能与某些Topic.id 发生冲突。

由于Buy::TopicTopic 的子类,因此您现在实际上只有一个概念实体。除了你有两张表和一些疯狂的索引可以让你到达那里。

【讨论】:

  • 是的,这是一对一的关系。我没有得到争论的冲突部分。
  • CTI 通常用于基本模拟关系数据库的组合。即:您有一个个人和一个组织,两者都有共同的地址相关字段。然后,您可以制作一个联系人表,他们都可以链接到该表。此功能丢失,使Buy::Topic 只能由Topic 使用。在此处查看更多信息:laughingmeme.org/2004/08/14/…
  • 嗯,Buy::Topic 是对 Topic 的一些扩展,所以让 Buy::Topic 不属于 Topic 是没有意义的。而且由于在我开始维护它之前已经完成并设置了它,所以我不会更改它。
【解决方案2】:

伙计,这没关系,只需调用您的列 topic_parent_id 并像这样创建关联:

belongs_to :parent, :class_name => 'Topic', :foreign_key => 'topic_parent_id'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多