0

我有一个与 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 并希望在数据库级别执行此操作。有没有办法做到这一点?我知道我可以使用模型字段验证,但我也想在数据库级别实现它。有小费吗?提前致谢!

4

1 回答 1

1

数据库级别的规则称为约束

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语法添加约束 - 只有 onCREATE TABLE才能添加约束。见答案

另外,rails 6.1+ 支持约束,请参阅另一个答案

于 2021-07-27T21:16:07.173 回答