其他表上的validates_uniqueness_of范围

时间:2009-09-28 08:45:35

标签: ruby-on-rails

用户属于群组群组属于公司

我想确认每个公司的用户名是唯一的。所以我的数据库可以有多个dublicate用户名,只要它们属于不同的公司。

逻辑步骤是使用validates_uniqueness _of范围并使用公司ID(存储在组中)。有没有办法可以访问其他表,还是我需要以不同的方式解决这个问题?

感谢

3 个答案:

答案 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