我有两个符号,其值由用户设置。
我需要验证它们的长度。每个符号的最大长度需要为32减去另一个符号的长度。
到目前为止,我已经这样写过,但这不起作用。有没有人对这如何运作有任何建议?
validates :id, presence: true, uniqueness: { scope: :name }, length: { maximum: 32 - :name.length }
validates :name, uniqueness: { scope: :id }, length: { maximum: 32 - :id.length }
注意:我只是一名毕业生,所以我很有可能做错了,因为我还在学习并且还没有真正理解符号。
答案 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) }