无法使自定义验证方法有效

时间:2015-12-01 16:59:09

标签: ruby-on-rails activerecord

我添加了以下代码作为我的模型的自定义验证方法:

validate :delivery_date_cannot_be_after_order_date, on: :update

def delivery_date_cannot_be_after_order_date
    puts 'running method'
    if promised_delivery_date.present? && promised_delivery_date < self.created_at 
        puts 'detected error'
        errors.add(:promised_delivery_date, "can't be in the past")
    end
end

当我运行它时似乎永远不会传递IF语句。

后来,我删除了IF语句,它仍然没有返回任何错误,并且更新运行成功。

我也试过这个:

def delivery_date_cannot_be_after_order_date
    puts 'running method'
    if self.promised_delivery_date.present? && self.promised_delivery_date < self.created_at 
        puts 'detected error'
        errors.add(:promised_delivery_date, "can't be in the past")
    end
end

但仍然是同样的问题..

这是我在没有IF语句的情况下运行它的代码,我会假设每次更新时都会返回错误,但是没有发生

1 个答案:

答案 0 :(得分:1)

尝试解析数据库中的日期,如下所示:(我得到类似的东西并使用下面的代码)

date

这里的事情是,当您将日期与&lt; &GT; =并且这些日期被转换为字符串(不知何故),这些比较器将仅适用于日期而不是数月或数年。因此,在比较两个日期之前,请尝试解析对象self

请注意,只有在创建类方法(由模型在任何地方调用)时才需要使用using System.Data.Entity.Infrastructure; using System.Data.Entity.Migrations; using System.Data.Entity.Migrations.Infrastructure; const string ScriptFile = "Migration.sql"; const string ConnectionString = @"Server=.\SqlExpress;Database=...;Trusted_Connection=True;"; const bool AutomaticMigrationDataLossAllowed = false; var targetDb = new DbConnectionInfo(ConnectionString, "System.Data.SqlClient"); var config = new MyDbMigrationsConfiguration { AutomaticMigrationDataLossAllowed = AutomaticMigrationDataLossAllowed, TargetDatabase = targetDb, }; var migrator = new DbMigrator(config); var scripter = new MigratorScriptingDecorator(migrator); var script = scripter.ScriptUpdate(null, null); File.WriteAllText(ScriptFile, script); Console.WriteLine("Migration Script Generated: " + ScriptFile); 关键字,但在这种情况下(我认为),您需要一个实例方法(由任何实例调用)。