【问题标题】:Rails - DB Level Validation for `:start_date` and `:end_date`Rails - `:start_date` 和 `:end_date` 的 DB 级别验证
【发布时间】:2021-07-27 17:10:53
【问题描述】:

我有一个关于 Rails 中以下代码的问题:

class CreateEmployments < ActiveRecord::Migration[6.0]
  def change
    create_table :employments do |t|
      t.string :title, null: false
      t.string :company_name
      t.datetime :start_date
      t.datetime :end_date
      t.integer :user_id

      t.timestamps
    end
  end
end

我试图禁止数据库接受任何大于 :end_date 的 :start_date 值。我希望 :end_date 始终大于 :start_date 并希望在数据库级别执行此操作。有没有办法做到这一点? 我知道我可以使用模型字段验证,但我也想在数据库级别实现它。有小费吗? 提前致谢!

【问题讨论】:

    标签: ruby-on-rails validation activerecord db-schema


    【解决方案1】:

    数据库级别的规则称为constraints

    class AddEmploymentsDateConstraint < ActiveRecord::Migration
      def self.up
        execute "ALTER TABLE employments ADD CONSTRAINT employments_date_check CHECK (end_date > start_date)"
      end
    
      def self.down
        execute "ALTER TABLE employments DROP CONSTRAINT employments_date_check"
      end
    end
    

    了解使用的数据库很重要。比如使用SQLite,不能使用ALTER TABLE语法添加约束——只有CREATE TABLE可以添加约束。见answer

    此外,rails 6.1+ 支持约束,请参阅another answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-13
      • 2017-06-07
      • 2019-12-18
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 2020-09-09
      相关资源
      最近更新 更多