【问题标题】:SailsJS uniqueness scope multiple columnsSailsJS 唯一性范围多列
【发布时间】:2015-06-10 12:35:48
【问题描述】:

对于单一的唯一性检查:

title: {
      type: 'string',
      required: true,
      unique: true
    }

dateTime: {
      type: 'string',
      required: true,
      unique: true
    }

有没有办法根据跨越 1 列的唯一性来限制模型创建/更新?假设现在我需要使用字符串 + dateTime 使表是唯一的。类似validates :title, uniqueness: { scope: :dateTime, :case_sensitive => false } in Rails.

【问题讨论】:

    标签: sails.js


    【解决方案1】:

    您可以使用afterValidate 添加您自己的跨越多个列的验证。

    afterValidate: function (values, cb) {
        Foo.findOne({
            title: values.title,
            dateTime: values.dateTime
        }).exec(function(err, foo){
            if(err) return cb(err);
            if(foo) return cb('Not unique');
            cb(null, values);
        });
    }
    

    【讨论】:

    • 哇,这正是我所做的,但我认为应该有更好的方法。我想我只会满足于此。我只是希望我不必做这么多不必要的查询。你似乎已经回答了我的很多问题。你是帆的贡献者吗?
    • 几乎没有:) 我已经使用sails 大约一年了,所以我对一堆概念非常熟悉。我在这里得到了很多帮助,所以我只是回馈。如果你想让别人看看一个特别讨厌的问题,issues 的状态也很好。
    • 如果我不能为回购做出贡献,我宁愿不提出问题。其实我知道这整件事是如何运作的。让它工作可能有一些技巧,但是来自 Rails,我觉得很多常见问题仍然没有在 Sails 中得到解决。但我最后一次检查它有超过 10k 颗星。似乎是最流行的 nodejs 框架之一。
    【解决方案2】:

    当我发现这个技巧可行时,我正在寻找这个问题的答案。

    对于这个模型

    title: {
      type: 'string',
      required: true,
    } 
    dateTime: {
      type: 'string',
      required: true,
    }
    

    我们可以使用

    Model.findOrCreate({title:"Your Title",dateTime:"DateTime"}).exec(console.log)
    

    这里 unique=true 从两个属性中删除。以下是问题中最初提出的使用 unique=true 的效果。

    a) 不使用 unique=true 时

    Data 1: title="Google", dateTime="2015-05-25T10:26:20.428Z" | will get accepeted
    Data 2: title="Facebook", dateTime="2015-05-25T10:26:20.428Z" | will get accepeted
    Data 3: title="Google", dateTime="2015-05-25T10:26:20.428Z" | will get rejected (because same as 1)
    

    b) 使用 unique=true 时

    Data 1: title="Google", dateTime="2015-05-25T10:26:20.428Z" | will get accepeted
    Data 2: title="Facebook", dateTime="2015-05-25T10:26:20.428Z" | will get rejected (because dateTime is same as 1)
    Data 3: title="Facebook", dateTime="2016-06-26T10:26:20.428Z" | will get rejected (because title is same as 2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多