许多模型的一个验证或如何正确进行验证

时间:2013-06-17 08:55:28

标签: ruby-on-rails ruby ruby-on-rails-3.1

我有7个模型附件为其他模型设置了附件日期。我需要验证attache的日期没有交集periud,例如:

class AttachNetworkToUser < ActiveRecord::Base

  attr_accessible :dt_begin, :dt_end, :network_id, :user_id
  validates :dt_begin, :dt_end, :network_id, :user_id, :presence => true

  belongs_to :network
  belongs_to :user

  validate :period_attach?


  def period_attach?
    user = AttachNetworkToUser.select("id, dt_begin, dt_end").where("network_id = :network_id  " , { :network_id => self.network_id} )
    user.each do |t|
      if ( (self.dt_begin >= t.dt_begin and self.dt_begin <= t.dt_end) or (self.dt_end >= t.dt_begin and self.dt_end <= t.dt_end) ) or (self.dt_begin < t.dt_begin and self.dt_end > t.dt_end )
        self.errors[:dt_begin] << " intersection periud! You can consolidate with " + (t.dt_end+1).to_s
      end
      if self.dt_begin > self.dt_end
        self.errors[:dt_begin] << " can not be more dt_end"
      end
    end
  end
end

看起来像代码味道。在其他Attache模型中,我重复了此验证的代码,但其他参数如下:{:Attach=>self,:user_id=>self.user_id,:network_id=>self.network_id,:dt_begin=>self.dt_begin,:user_id=>self.user_id}

如何正确地解决这个目标。 也许将验证代码放在其他类中并发送如下参数:AttachModelValidator.new({:Attach=>self,:user_id=>self.user_id,:network_id=>self.network_id,:dt_begin=>self.dt_begin,:user_id=>self.user_id}).valid

1 个答案:

答案 0 :(得分:0)

通常我会说保留每个模型中的所有验证,以便很好地理解代码。

从技术上讲,可以这样做:

如果您的字段在各种模型中具有相同的名称,您可以在模块中编写一次所有验证,并将模型放在同一模块下。

如果您的字段名称不同,您可以在共享模块中定义方法,以接收字段名称并执行验证。

同样,我不建议这样做。除非你有一个共同的逻辑,你想在模型之间共享。

干杯。