Grails中两个域类的值的唯一约束

时间:2014-06-16 13:04:43

标签: mongodb grails constraints unique

我有两个域类。一个是:

 class User {
    String login
    String password
    String firstName
    String lastName
    String address
    String email

    static constraints = {
        login blank:false, size:5..15,matches:/[\S]+/, unique:true
        password blank:false, size:5..15,matches:/[\S]+/
        firstName blank:false
        lastName blank:false
        email email: true
    }
 }

其他是

class AddWebsite {

String website
User user
static constraints = { 
                     website blank:false 
                     website(unique: ['user'])
                     }
}

我在后端使用MongoDB。我需要对于特定的登录值,所有siteURL值都应该是唯一的。例如:login = abc@gmail.com。然后,此用户只能在数据库中拥有所有唯一URL。但是对于不同的用户可以存在相同的URL。如何使用唯一约束或任何其他方法来做到这一点?

3 个答案:

答案 0 :(得分:1)

在这种情况下,您应该能够在AddWebsite域类上设置唯一约束,例如:

class AddWebsite {
  String website
  User user
  static constraints = { 
    website(blank:false, unique: ['user'])
  }
}

这将确保每个网站在每个用户的数据库中都是唯一的。请注意,多个约束将应用于属性网站。

已修改以匹配更新的问题。

答案 1 :(得分:1)

使用嵌入式子文档在SiteURL内存储User个实例。然后,您将集合定义为Set,这可确保其所有条目都是唯一的。如果要使用默认的mongo集合类型或想要保留顺序,请定义一个拦截器,如:

def beforeSave = {
  urls = urls.unique() 
}

更新: 如果您的网址是纯字符串,请使用默认的原始集合(无hasMany):

class User {
  String login
  //...
  Set urls = new HashSet()
}

答案 2 :(得分:0)

终于奏效了。虽然它没有在AddWebsite域类中验证,但我在进入网站时得到的用户不能出现null错误。我做了以下更改并开始工作:

class AddWebsite{
    String website
    User user
    static belongsTo = [user: User]
    static constraints = {
        website( url:true, unique: ['user'])
    }
}

在我的控制器中,我还将用户对象的值设置为会话变量:

def addWebsites() {
    if(request.method == 'POST') {
        def w = new AddWebsite()
        w.properties[
                    'website'
                ] = params
        w.user = session["user"]                       //modified to make it work
     if(w.save()) {
            render view:'addWebsites', model:[message: "Successfully saved"]
        }
        else {
            return [addWebsite:w]
        }
    }

希望它可以帮助某人:)