我添加了以下代码作为我的模型的自定义验证方法:
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语句的情况下运行它的代码,我会假设每次更新时都会返回错误,但是没有发生
答案 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);
关键字,但在这种情况下(我认为),您需要一个实例方法(由任何实例调用)。