【问题标题】:Rails: belongs_to vs has_oneRails:belongs_to vs has_one
【发布时间】:2009-05-22 21:00:54
【问题描述】:

一个关于 Rails 关联的新手问题。

我有一个 Bug 模型和一个 Status 模型。状态基本上只是一个键/值对表。在可用的选择中,我会说 Bug has_one Status 是最有意义的。不过根据this

内容属于_内容模板。去 回头看看我是如何描述的 问题,你会发现它有效。 使用belongs_to,表接受 外键的责任。所以 内容有一个 content_template_id。和 ContentTemplate 不需要任何东西。 我可以随意指点。完成。

Bug belongs_to Status 会更合适(因为 Bug 应该使用外键)。从语义上讲,他的例子是有道理的,但我的没有。这只是一个怪癖,在这种情况下看起来很奇怪,还是我不理解某事/做错了什么?

【问题讨论】:

    标签: ruby-on-rails model associations has-many belongs-to


    【解决方案1】:

    是的,我认为您刚刚在 Rails 中发现了一个看起来有点奇怪的场景。我认为将“状态”视为错误所属的一种类别可能会很有用——从这个角度来看,这是有道理的。

    【讨论】:

    • 我想这证明了 Rails 在语义上的工作非常好,遇到这种情况我就像“我一定做错了”
    【解决方案2】:
    TABLE:
        Bug
        id integer
        desc string
        status_id integer fk
    
        Status
        id integer
        desc string
    
    RAILS MODEL:
        Bug
        belongs_to :status
    
        Status
        has_many :bugs
    

    【讨论】:

    • Bug 会使用外键,因为一个状态可以有很多错误,但一个错误一次只有一个状态。
    • 您的新解决方案是我们对情况的看法,但它不起作用。当您执行 bug.status 时,它会在 status 中查找一个 bug_id 列,该列不存在。 has_one 或 has_many 需要与正在“拥有”的类中的 belongs_to 匹配。
    • 你会如何改变它?如果您愿意,请随时将我的答案复制到您的答案中并在那里进行更改。我只是想知道您认为模型应该是什么样子。
    • 应该是 Bug.belongs_to :status,就像提问者猜测的那样。它看起来很尴尬,但这就是 Rails 需要表达关系的方式 AFAIK。 belongs_to 的意思是“我的表有外键”。这样 bug.status 和 status.bugs 都会正常工作。
    【解决方案3】:

    您没有准确解释您希望得到的 Bug 和 Status 之间什么样的关系,但我假设您对以下其中一项感兴趣:

    • 一对多:在这种情况下,Bug 类中应该有has_many,Status 类中应该有belongs_to
    • 一对一:在这种情况下,Bug 类中应该有has_one,Status 类中应该有belongs_to

    在这两种情况下,Status 都包含外键。在第二种情况下,措辞有点奇怪,因为一对一的关系实际上是不对称的(应该只在一侧有一个 FK)。

    【讨论】:

    • 问题在于,无论从概念上还是在正确的实现中,一个错误一次都没有很多状态。从概念上讲,我们认为一个状态属于很多错误,但 Rails 只能将其表示为一个有很多错误的状态。
    • @chuck:差不多就是这样。一对多与多对一。从逻辑上讲,几乎是等价的,但在概念上是有区别的
    【解决方案4】:

    如果 Status 只是一个查找/键值表,听起来您可能想要在 Status 和 Bug 之间建立habtm(has_and_belongs_to_many) 关系。使用 habtm,您最终会得到一个 bugs_statuses 连接表,其中包含 bug_idstatus_id 列以及错误和状态表。

    【讨论】:

    • 这适用于多对多关系,但事实并非如此。这是多对一的。我的问题基本上是围绕这种关系的措辞只有在一对多而不是多对一的情况下才有意义,以及是否有更优雅的方式来处理它。
    • 明白。我想我对“Bugs”及其“状态”的典型想法是,Bug 可能同时处于多个状态(例如“worksforme”和“open”),或者您可能希望保留 Bug 状态的历史记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多