续集:模式迁移和模型验证方法之间的DRY

时间:2014-05-20 08:19:42

标签: ruby validation sequel

我想知道我是否错过了一种方法来避免在我的Sequel :: Model#validate子类方法中重复验证代码,因为我已经将所有约束放入我的迁移文件中。

这是我正在谈论的一个简单例子:

  Sequel.migration do
    change do
      create_table :users do
        primary_key :id
        String  :name, :null => false, :unique => true
      end
    end
  end

  class User < Sequel::Model
    def validate
      super
      validates_presence :name
      validates_unique :name
      validates_type String :name
    end
  end

看起来非常痛苦并且容易出错,必须重复验证方法中的所有约束。我错过了什么或者别无他法吗?

任何建议都将不胜感激,谢谢

2 个答案:

答案 0 :(得分:1)

续集有一些不错的plugins and extensions

Sequel::Model.plugin(:auto_validations)
Sequel::Model.plugin(:constraint_validations)

DB.extension(:constraint_validations)

auto_validations

  

auto_validations插件会自动设置三种类型   模型列的验证:

     
      
  • 所有列的类型验证
  •   
  • NOT NULL列上的not_null验证(可选,存在   验证)
  •   
  • 对具有唯一索引的列或列集进行唯一验证
  •   

请参阅http://sequel.jeremyevans.net/rdoc-plugins/classes/Sequel/Plugins/AutoValidations.html

constraint_validations

  

constraint_validations扩展程序旨在轻松创建   create_table和alter_table块中的数据库约束。它   还将有关约束的相关元数据添加到单独的表中,   constraint_validations模型插件用于设置自动   验证

参见http://sequel.jeremyevans.net/rdoc-plugins/files/lib/sequel/extensions/constraint_validations_rb.htmlhttp://sequel.jeremyevans.net/rdoc-plugins/classes/Sequel/Plugins/ConstraintValidations.html

您的示例将如下所示

Sequel::Model.plugin(:auto_validations)
Sequel::Model.plugin(:constraint_validations)

Sequel.migration do
  up do
    extension(:constraint_validations)

    create_table :users do
      primary_key :id
      String :name, :null => false, :unique => true

      validate do
        presence :name,
                 name: :presence_name
      end
    end
  end

  down do
    extension(:constraint_validations)

    drop_table(:users)
  end
end

class User < Sequel::Model
end

答案 1 :(得分:0)

我认为,这是正常的。别担心。