我有一个典型的用户模型(用户名,密码,名称等)。我想允许用户将三个选定的类别附加到他们的帐户。这三个类别中的每一个都存在于类别模型中。
如何在不使用中间表进行跟踪的情况下,将三个外键从Category链接到单个用户?每个类别可以属于任意数量的用户,但每个用户只能有三个类别。
我玩过has_many:通过但是我真的不认为关系表是必要的,它会生成一个很多编码,以便与我合作。
有什么想法吗?
答案 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拉出到班级常数或配置设置。
并且不要害怕代码。做得对,代码会害怕你。