4

假设我有两个模型——用户和帐户。每个账号最多可以关联n个用户,一个用户只能关联一个账号。

说用户似乎很自然

belongs_to :account

和帐户

has_many :users

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

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

@account.users << someuser 

但如果你用过

@account.users.create

我还考虑过在 User 模型中使用 before_save 实现限制可能更实用,但在 User 模型中实现 Account 业务规则似乎有点偏离。

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

编辑:每个帐户的 n 个用户将是存储在个人帐户中的一些业务数据,而不是在代码中随意浮动的直接幻数。

4

2 回答 2

6

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

class User
  belongs_to :account
end

这样,您将确保用户只能关联到一个帐户。

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

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 个用户,您将无法为帐户创建新用户。

于 2008-11-15T12:15:19.667 回答
2

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

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

于 2008-11-15T13:19:56.713 回答