【问题标题】:Multiple foreign keys referenced in a single Rails model单个 Rails 模型中引用的多个外键
【发布时间】:2009-05-28 01:14:11
【问题描述】:

我有一个典型的用户模型(用户名、密码、姓名等)。我想允许用户将三个选择的类别附加到他们的帐户中。三个类别中的每一个都存在于 Category 模型中。

如何在不使用中间表进行跟踪的情况下将类别中的三个外键链接到单个用户?每个类别可以属于任意数量的用户,但每个用户只能拥有三个类别。

我玩过 has_many :through,但我真的不认为关系表是必要的,它会在我的末端生成 很多 编码来使用它。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    从代码可维护性的角度来看,即使您现在可能希望将用户可以选择的类别数量限制为 3 个,但您可能不想使用此限制对其进行编码。当您想将其增加到 5 或将其减少到 1 时,您稍后会踢自己。我的建议是仅将 has_and_belongs_to_many 与连接表一起使用(您不需要 :through,因为据我所知告诉你,你不需要一个连接模型,只需要一个连接表)。使用 HABTM 将自动使用连接表,因此您不必担心编写代码来处理它。只需确保正确命名连接表及其列即可。

    至于实际上将用户限制为仅 3 个类别,只需在视图/控制器中实现该限制(即限制 UI,使他们不能选择超过 3 个)。

    我确定您已经阅读过这篇文章,但如果您还没有阅读,这里是 HABTM 的 docs

    【讨论】:

    • 听从了您的建议,最终效果非常好,非常干净。谢谢!我想核心问题是我对 has_and_belongs_to_many 和连接表的理解。
    • HABTM 一开始吓到我了,因为它看起来太复杂了。但是一旦你习惯了它以及它有什么好处,如何正确地运用它的力量就变得很清楚了。很高兴我能帮上忙。 Ian 的模型级验证想法也是一个很好的遵循。
    【解决方案2】:

    HABTM 是您的最佳选择。要将用户限制为三个类别,请添加模型级别验证:

    class User < ActiveRecord::Base
      has_and_belongs_to_many :categories
      validate :no_more_than_three_categories
    protected
      def no_more_than_three_categories
        self.errors.add(:categories, "may not have more than three") if categories.size > 3
      end
    end
    

    根据您的判断,将幻数 3 提取到类级别常量或配置设置。

    不要害怕代码。做对了,代码会让你害怕。

    【讨论】:

    • 感谢您在模型中保留验证的奖励材料(我非常喜欢)。我仍在(并将永远)学习。
    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2021-10-31
    • 2013-10-20
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多