导轨 4 - 确保has_many关联对象(整数)从 0 开始,并且在增量值中没有"gap"



我有两个模型共享一个有很多/属于关系

交易有许多步骤。

每个步骤都是一个名为"外观顺序"的属性,用于定义它出现的时间(与id不同)。

这是一个整数,我验证它是>=0和<15

我直接在Active Admin的交易版中输入步骤,这要归功于:

accepts_nested_attributes_for :steps, allow_destroy: true

我已经有了一个验证,确保不会有一个步骤属于同一笔交易并共享类似的"外观订单",这要归功于:

validates :appearance_order, uniqueness: { scope: [:deal_id] }

但今天,将接受各种相关步骤为"外观订单"1、5、7、14的交易。我需要找到一个拒绝该情况的验证

在交易模型上,我需要验证以确保:

  • 在一笔交易(id:4).步骤(与交易相关的步骤)中,至少有一笔交易的"外观顺序"等于0

  • 然后交易(id:4)。步骤"外观顺序"的每个值之间没有"差距"。它必须是0,1,2,3,4,。。。。等等

例如,如果我创建了一个有4个步骤的交易,那么"外观顺序"属性为0,1,2,5的交易应该被拒绝,因为2和5之间有差距。

这是我的代码:

型号/step.rb

class Step < ActiveRecord::Base
belongs_to :deal,             :foreign_key => 'deale_id'
validates :appearance_order,
presence: true,
numericality: { greater_than_or_equal_to: 0,
less_than_or_equal_to: 14}
validates :appearance_order, uniqueness: { scope: [:deal_id] }
end

型号/交易.rb

class Deal < ActiveRecord::Base
has_many   :steps,          dependent:  :destroy do   
# source: homeonrails.com/2012/10/validating-nested-associations-in-rails/
def length
reject(&:marked_for_destruction?).length
end
end 
validates :steps, length: { maximum: 15 }
end

检查需要检查的东西怎么样:

validate :appearence_order_gaps
private
def appearence_order_gaps
previous_step = deal.steps.last
if previous_step
(previous_step.appearance_order - appearence_order) == 1
else
appearence_order.zero?
end
end

所以,如果有上一个步骤,那么它的appearence_order应该是负一,否则当前步骤appearence_order应该等于零。

最新更新