Ruby on rails Rails 3-相互验证模型的多个实例

Ruby on rails Rails 3-相互验证模型的多个实例,ruby-on-rails,forms,validation,architecture,refactoring,Ruby On Rails,Forms,Validation,Architecture,Refactoring,我正在开发一个处理员工考勤卡的应用程序,我正在尝试创建一个表单,允许员工在给定的时间段内编辑所有的打孔。我用它作为表单的基础,并能毫无困难地把事情办好: class BlocksController < ApplicationController def update @block = Block.find_by_id(params[:id]) @punches = @block.punches keys = params[:punches].keys

我正在开发一个处理员工考勤卡的应用程序,我正在尝试创建一个表单,允许员工在给定的时间段内编辑所有的打孔。我用它作为表单的基础,并能毫无困难地把事情办好:

class BlocksController < ApplicationController

def update
    @block = Block.find_by_id(params[:id])
    @punches = @block.punches

    keys = params[:punches].keys
    values = keys.map { |k| params[:punches][k] }
    @punches = Punch.update(keys, values).reject { |p| p.errors.empty? }
    if @punches.empty?
      flash[:notice] = "Punches updated"
      redirect_to employee_timecard_path(current_user, @block.timecard)
    else
      render :action => "edit"
    end
  end
class BlocksController“编辑”
终止
终止
但问题是,我需要能够验证用户没有以没有意义的方式编辑打孔(例如,将打孔时间更改为打孔时间晚于打孔时间,反之亦然)

我尝试通过自定义模型验证来实现这一点,但是通过验证的单个模型不知道其他值正在更新,因此批处理中的第一个问题是将其新值与其他值的更新前值进行比较

我唯一能想到的另一种方法是循环通过
params[:punchs]
发送到控制器中的更新方法,但这似乎与“胖模型,瘦控制器”的约定背道而驰


有没有办法让我既吃蛋糕又吃蛋糕?如果您有任何建议,我们将不胜感激。

我也遇到了类似的问题:

  • 计划有开始和结束日期
  • 时间表不应该相互重叠
  • 以下是我的结论:

    这里有两种有效性:

  • 单个模型的有效性(例如,是否存在开始日期?)
  • 模型集合的有效性(例如,是否有任何实例对重叠?)
  • 我觉得只有第一种类型实际上是个人模型的责任。但第二类也不是控制器的责任


    在OP的情况下,我不确定是最好在Punch类上定义一个验证器,还是创建一个负责验证整个Punch列表的新对象,但无论如何,应该有一个对象知道整个集合,并且可以决定它是否有效。

    我仍然认为您在Block controller中的穿孔机中被卡住了。如果合适的话,控制者应该被允许长胖。就你而言,我想是的。我能想到的唯一能减少控制器代码的事情就是效率低下,不必要地调用ActiveModel层来保持控制器的精简似乎不是一个好的折衷办法,有点像吸烟来保持精简!你能用后滤器或前后滤器吗?最糟糕的情况是将所有内容保存到数据库中,在后过滤器中进行检查,然后以某种方式撤消它。我不太了解过滤器,但从我收集的信息来看,这可能会让您在保存更新之前将其作为一个组进行检查,并在验证失败时中止保存。请参阅:至于验证的位置,我想您可以为Punchs设置一个类方法,用于验证整个记录集(或某个作用域子集)(例如,可能会为失败的记录返回一个id列表)。@SteveRowley我现在基本上就是这么做的。我将在控制器中编写的代码粘贴到模型中的一个方法中,同时传递参数散列。我认为这仍然是一个相当丑陋的解决方案,但至少它是有效的。值得一提的是,如果我对代码不熟悉,并且寻找验证某个对象集的方法,我会查找该类的代码,而不是另一个类的控制器代码,所以说实话,这听起来不错,但我明白为什么其他人会认为这不太理想。