用户属于群组,群组属于公司
我想确认每个公司的用户名是唯一的。所以我的数据库可以有多个dublicate用户名,只要它们属于不同的公司。
逻辑步骤是使用validates_uniqueness _of范围并使用公司ID(存储在组中)。有没有办法可以访问其他表,还是我需要以不同的方式解决这个问题?
感谢
答案 0 :(得分:3)
在这个设计中,我看到一个问题,如果用户可以属于一个组,并且一个组可以属于一个公司。但是,用户和公司的关联是非常间接的,实际上它应该是直接的,与其与群体的关联无关。
因此,例如,改变公司用户切换组,而不是公司,这不完全正确。在你的背景下我可能没有意义。
因此,在User表中存储公司信息是有意义的(至于唯一性测试,关系也是直接的)。
和
validation_uniqueness_of :user, :scope=> company_id
会起作用。
更新
我不是要求你对表格进行非规范化,这个小组仍然可能与公司紧密联系在一起。但这种关系与用户公司
无关我的观点基本上是,User对象应该可以直接看到Company类,而不是通过“Group”。
这意味着将公司列添加到您的表中,这就是全部,并与用户和公司建立直接关系。
这不会是一个管理上的麻烦。我有点期待,写一些像
这样的东西“user.company”
而不是
“user.group.company”。
无论如何。这只是我的观点,我不知道整个背景,所以我的建议是基于我在你的问题中看到的
答案 1 :(得分:1)
制定自定义验证规则可能是解决此问题的最佳方法。
答案 2 :(得分:1)
我也遇到了这个问题并开始研究答案。我使用Tarscher的答案来提出以下解决方案。
validates_each :username do |record, attr, value|
if User.joins(:group).where('username = ? and groups.company_id = ?', record.username, record.group.company_id).present?
record.errors.add attr, 'This username is already taken by some on in your company'
end
end