ActiveRecord验证:一个符号的最大长度为值减去另一个符号的长度

时间:2016-02-26 05:42:37

标签: ruby-on-rails activerecord

我有两个符号,其值由用户设置。

我需要验证它们的长度。每个符号的最大长度需要为32减去另一个符号的长度。

到目前为止,我已经这样写过,但这不起作用。有没有人对这如何运作有任何建议?

validates :id, presence: true, uniqueness: { scope: :name }, length: { maximum: 32 - :name.length }
validates :name, uniqueness: { scope: :id }, length: { maximum: 32 - :id.length }

注意:我只是一名毕业生,所以我很有可能做错了,因为我还在学习并且还没有真正理解符号。

1 个答案:

答案 0 :(得分:0)

听起来你需要在这里进行自定义验证:

validates :id, presence: true, uniqueness: { scope: :name }
validates :name, uniqueness: { scope: :id }
validate :name_and_id_max_length

def name_and_id_max_length
  if (id || '').length + (name || '').length > 32
    errors.add(:base, "id and name combined must be 32 or fewer characters")
  end
end

Btw:Rails中的id通常是一个整数,但您似乎将其视为字符串。这表明还有一些混乱。

:id.length也不是有效的Ruby。在这些validates声明中,您正在调用 class 方法,因此还没有id的实例。要对实际值进行算术运算,您需要一个proc。 Rails在这里不支持AFAIK,但在其他情况下,嵌入在类级别声明的每个实例计算的片段是一种有用的模式:

validates :name, length: { maximum: proc { 32 - id.length } }

例如,一个真实的例子:

scope :recent, -> { where("created_at > ?", 24.hours.ago) }