假设我有两个模型 - 用户和帐户。每个帐户最多可以有n个与之关联的用户,而用户只能与一个帐户关联。
说用户
似乎很自然belongs_to :account
和帐户
has_many :users
但是,在通过has_many声明限制关联数量方面,我不清楚最佳做法。我知道有一个:limit参数,但这只限制了返回的关联数,而不是可以存在的数量。
我怀疑答案是使用类似:before_add。但是,这种方法似乎只适用于通过<<<< 。所以当你使用
时它会被调用@account.users << someuser
但如果您使用
则没有@account.users.create
我还认为在User模型中使用before_save实现限制可能更实际,但似乎在User模型中实现Account业务规则有点过时了。
限制关联数量的最佳做法是什么?
编辑:每个帐户的n个用户将是存储在各个帐户中的一些商业数据,而不是在代码中无处不在的直接幻数。
答案 0 :(得分: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位用户,您将无法为帐户创建新用户。
答案 1 :(得分:2)
我认为你的规则有不同的解释。将该规则视为“您无法将用户添加到已有3个用户的帐户”。现在它是一个用户规则,在用户对象上实现它似乎非常自然,@ Raimond的解决方案就足够了。
你也可以考虑将其作为一个数据库约束来实现,但我可能不会这样做... 3似乎是一个随意改变的数字,以后我和我怀疑你会更喜欢它在代码中捕获而不是隐藏在数据库约束中。