验证外部gem的ActiveRecord模型的最佳方法

时间:2018-02-28 17:16:01

标签: ruby activerecord ruby-on-rails-5

将验证添加到外部Gem的activerecord模型的最佳方法是什么?

module Library
    class Model < ActiveRecord::Base
       validates :field_active, inclusion: { in: [true, false] }
    end
end

我想在其中添加另一个validates,例如

validates :me_too, presence: true

但由于它是外部宝石,所以不可能只在validates :field_active下面添加它。

我想知道这样做的最佳做法是什么。 class_eval是最好的方式还是不赞成的?

1 个答案:

答案 0 :(得分:1)

Ruby拥有所谓的“开放课程”。您可以打开任何类(在任何时候)并添加更多方法。这应该有效:

module Library
  class Model
    validates :me_too, presence: true
  end
end

它打开已经定义的Library::Model,只是添加了一行代码到那里(不替换/删除现有代码)。

请注意,这取决于Library::Model已经已加载(这不能保证)。这应该是一个更安全的选择:

Library::Model.instance_eval do
  validates :me_too, presence: true
end

如果Library::Model尚未加载,它将触发 for (i, point) in allPoints.enumerated() { let nextPoint = i == allPoints.count - 1 ? allPoints[0] : allPoints[i+1] signedArea += (point.x * nextPoint.y - nextPoint.x * point.y) } let clockwise = signedArea < 0 的加载。