【问题标题】:Abstracting ActiveRecord Attributes抽象 ActiveRecord 属性
【发布时间】:2011-05-06 17:19:03
【问题描述】:

在不进一步规范化数据库的情况下抽象 ActiveRecord 属性的最佳方法是什么?

例如,假设有一个名为addresses 的数据库表,其中包含zip_code 列和一个确定邮政编码是否有效的方法:

class Address < ActiveRecord::Base
  def zip_code_valid?
    ..
  end
end

我希望有:

class Address < ActiveRecord::Base
  ..
end

class ZipCode
  def valid?
    ..
  end
end

当我执行Address.find(1).zip_code 时,它返回一个ZipCode 与一个字符串。我不希望通过创建一个名为zip_codes 的表来规范化数据库。这个例子是假设的,我目前没有一个真实世界的例子;我只是想知道我怎么可能做到这一点。

谢谢。

【问题讨论】:

    标签: ruby-on-rails activerecord abstraction abstract-data-type


    【解决方案1】:

    我不确定您为什么要为ZipCode 执行此操作,但要回答您的问题,您应该考虑使用 Rails 聚合。

    这是文档:

    http://api.rubyonrails.org/classes/ActiveRecord/Aggregations/ClassMethods.html

    如果您对想要完成的事情有具体问题,请告诉我,我可以尝试回答这些具体问题。

    【讨论】:

    • 谢谢。带有地址和邮政编码的示例是我很快想到的一个示例,用于解释我可能想做的事情。我试图找到在不进一步规范化数据库的情况下抽象 ActiveRecord 属性的最佳方法。我将查看您链接到的文档。
    • 我也这么认为。我已经多次做过同样的事情,用一个例子来解释更容易,但有时很难想出一个容易描述的例子。我希望你能在聚合中找到你想要的东西。如果您有任何问题,请告诉我。
    【解决方案2】:

    如果你不打算对街道、门牌号、城市等做同样的事情,我认为将邮政编码抽象成一个类是没有意义的。你已经将它作为地址中的一个单独列表,因此将其存储在自己的类中是没有意义的(从 ActiveRecord 的角度来看)。或者,如果您将邮政编码存储在他们自己的表中(以及因此类),您会获得什么?在我看来,如果将单个属性作为其当前所在的聚合的一部分是有意义的,那么将单个属性保留在单独的类/表中就太过分了。

    【讨论】:

    • 谢谢。这是一个关于将抽象推向边缘的假设问题。昨晚我在阅读 Code Complete 和抽象数据类型部分时想到了这个问题。虽然它可能走得太远,但让我们假设将来会有几十个方法只与邮政编码相关,在这种情况下,我相信将这些方法抽象成 ZipCode 与地址是有益的。
    • 如果你要对这个问题做出判断,你至少应该先给出一个答案。
    • @jesse - 你在开玩笑吗?你知道我确实提供了答案吗?我的回答是他应该坚持他提供的第一个例子,而不是将它抽象到自己的类中。另一位选民意识到这一点并投票给我。很明显,如果我提供了一个关于为什么他应该避免将邮政编码放入其自己的类中的深入答案,我就阅读了这个问题。
    • @McStretch,Andrew 询问社区如何“获取 ActiveRecord 属性并对其进行抽象”?你告诉他他不应该抽象它,这不是没有答案吗?此外,你问他,“如果你将邮政编码存储在他们自己的表中,你会得到什么?”当他明确表示他不想将邮政编码存储在他们自己的表中时。这意味着您没有仔细阅读该问题。最后,您认为新类需要新数据库表的假设是错误的。由于所有这些原因,我对你的答案投了反对票。
    • @jesse - 确认他最初拥有它的方式可能是最好的,这是怎么回事?至于你的第二点,将邮政编码存储在不同的类中可以与创建一个新表同时进行(他承认说“我不希望通过创建一个名为 zip_codes 的表来规范化数据库。”),所以它是重要的是要考虑到这一点。我并没有说它总是如此,但我的观点直接针对他关于避免创建新表的观点。你猜怎么着?他最初的解决方案(我赞同)就是这样做的。
    猜你喜欢
    • 2014-07-12
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多