1

我有一个模型,该模型具有在创建时提供的多个属性。该模型还具有一些从提供的属性派生的附加属性,我也想在创建时计算这些属性。更有问题的是,我希望能够对这些派生值运行验证(因为有些输入本身是有效的,会导致派生值无效)。

问题是当我这样做时:

class MyClass < ActiveRecord::Base
  attr_accessible :given1, :given2, :derived

  before_validation :derivation
  validates_uniqueness_of :derived

  def derivation
    self.derived = self.given1 + self.given2
  end
end

MyClass.new(:given1 => aNumber, :given2 => otherNumber)

我总是收到错误说我无法添加nilnil. 显然self.attribute是零,直到进一步进入验证和创建过程。

显然,我可以在稍后阶段设置我的派生值,并添加一个适用于给定属性的自定义验证,但这需要进行两次派生,这不会很干燥。

是否有其他方法可以在阶段中获得已分配但尚未验证的属性before_validates

编辑:为了澄清,我想在验证检查之前MyClass.new(:given1 => aNumber, :given2 => otherNumber)调用并计算派生值,以便验证检查就像我调用了. 问题是我似乎无法访问方法和方法中的传入值。MyClass.new(:given1 => aNumber, :given2 => otherNumber, :derived => aNumber + otherNumber):given1:given2before_validations

4

1 回答 1

1

我编写了自己的代码片段,如下所示:

class User < ActiveRecord::Base
  attr_accessible :email, :first_name, :last_name

  validates :email, uniqueness: true

  before_validation :derivation

  def derivation
    self.email = self.first_name + self.last_name
  end
end

运行以下没有产生错误:

»  u = User.new first_name: "leo", last_name: "correa"
=> #<User:0x007ff62dd8ace0> {
                      :id => nil,
              :first_name => "leo",
               :last_name => "correa",
                   :email => nil,
              :created_at => nil,
              :updated_at => nil,
}
»  u.valid?
  User Exists (0.9ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = 'leocorrea' LIMIT 1
=> true

运行u.save成功保存了记录,并在重复User.new并保存新记录时返回,ROLLBACK因为电子邮件已被使用。

在任何情况下,请确保将您正在使用的任何变量分配给 given1、given2 以及任何结果都确保不会给您错误,因为它会取消 before_validate 回调并且不会保存记录。

于 2013-01-09T22:00:02.757 回答