在模型中导入 rails_admin 时跳过验证

Skip validations in importing rails_admin in model

如果我在 rails_admin_import 中导入模型中的字段,如何跳过验证?喜欢:

Class Dog < ActiveRecord::Base
has_many :dog_quantity
has_many :dog_price
validates_presence_of :dog_quantity, :dog_price, :on => :import
end

有办法吗?谢谢!

也许尝试在 RailsAdmin mailing list 上提问。

您可能还想阅读“Get Rid of Your Admin Gem”。

而且,您是否仔细研究了 conditional validation 上的 Active Record 验证指南部分?

首先,一个警告。我不使用 rails_admin 或 rails_admin_import gem。但是,根据 https://github.com/stephskardal/rails_admin_import#import-hooks 上的文档,您可以:

Define instance methods on your models to be hooked into the import process, if special/additional processing is required on the data:

像这样:

class User < ActiveRecord::Base
  def before_import_save(record)
    # Your custom special sauce
  end

  def after_import_save(record)
    # Your custom special sauce
  end
end

知道这一点后,您可以在 #before_import_save 挂钩内的 model/record 上设置一个名为 is_importing 之类的临时标志,并根据其值有条件地进行验证。例如:

Class Dog < ActiveRecord::Base
  has_many :dog_quantity
  has_many :dog_price
  validates :dog_quantity, presence: true, unless: :is_importing
  validates :dog_price, presence: true, unless: :is_importing

  attr_accessor :is_importing

  def before_import_save(record)
    record.is_importing = true         
  end
end

这里有几点需要注意。首先,我将验证分成两个语句。其次,我正在使用我认为在 Rails 4 中可用的较新样式的验证语法。通常,这种样式是首选。如果您使用的是 Rails 版本 < 4,则返回使用 validates_presence_of,它应该仍然有效。第三,如果 before_import_save 从未被调用,is_importing 将为 nil,并且由于评估为假,验证将在应用程序的正常操作期间按预期触发(即:不导入)。

就像我说的,我没有测试任何这些,我或多或少有点想不通,所以可能会有错误。尽管如此,我的感觉是利用导入挂钩来解决问题是您想要的。

所以我的解决方案是分叉 rails_admin_import 并在 importer.rb 文件中我更改了

if object.save

进入

if object.save(:validate => false)