单个Rails模型中引用的多个外键

时间:2009-05-28 01:14:12

标签: ruby-on-rails

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

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

我玩过has_many:通过但是我真的不认为关系表是必要的,它会生成一个很多编码,以便与我合作。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

我确定你已经读过这篇文章了,但是如果你没有,那么这里是HABTM的docs

答案 1 :(得分: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拉出到班级常数或配置设置。

并且不要害怕代码。做得对,代码会害怕你。