限制has_many关系中关联数量的最佳实践?

假设我有两个模型 – 用户和帐户。 每个帐户最多只能有n个与之关联的用户,而用户只能与一个帐户关联。

用户说,这似乎很自然

belongs_to :account 

和帐户

 has_many :users 

但是,在通过has_many声明来限制关联数量时,我不清楚最佳实践。 我知道有一个:limit参数,但这只限制了返回的关联数,而不是可以存在的数量。

我怀疑答案是使用类似:before_add。 但是,这种方法似乎只适用于通过<<创建的关联。 所以当你使用它时会被调用

 @account.users << someuser 

但如果你使用的话就没有

 @account.users.create 

我还认为在User模型中使用before_save实现限制可能更实际,但似乎在User模型中实现Account业务规则有点偏差。

限制关联数量的最佳做法是什么?

编辑:每个帐户的n个用户将是存储在各个帐户中的一些业务数据,而不是在代码中无处不在的直接幻数。

首先,如果您的users表具有外键account_id,那么您需要使用

 class User belongs_to :account end 

通过这种方式,您将确保用户只能与一个帐户关联。

如果您想限制该帐户最多可以拥有3个用户,那么您可以定义以下validation:

 class User validates_each :account do |user, attr, value| user.errors.add attr, "too much users for account" if user.account.users.size >= 3 end end 

因此,如果帐户已有3个用户,您将无法为帐户创建新用户。

我认为你的规则有不同的解释。 可以将规则视为“您无法将用户添加到已有3个用户的帐户”。 现在它是一个用户规则,在用户对象上实现它似乎非常自然,@ Raimond的解决方案就足够了。

您也可以考虑将其作为数据库约束来实现,但我可能不会这样做… 3似乎是一个可能随后改变的任意数字而我,我怀疑你,希望它被捕获代码而不是隐藏在数据库约束中。