Ruby 在自定义验证中识别合并对象集合中的新记录

Ruby 在自定义验证中识别合并对象集合中的新记录,ruby,merge,compare,Ruby,Merge,Compare,我使用下面的函数合并两个集合,一个来自DB,另一个来自用户输入。我想在验证期间验证哪些记录来自DB,哪些是本地记录 def tags=(arg) if arg.is_a?(Array) @ids = arg.map{|x| x[:id]} tags << Tags.where(id: @ids ) else super end end 我的JSON如下(我只是为标记传递ID): 我也不认为这是

我使用下面的函数合并两个集合,一个来自DB,另一个来自用户输入。我想在验证期间验证哪些记录来自DB,哪些是本地记录

def tags=(arg)        
    if arg.is_a?(Array)
        @ids = arg.map{|x| x[:id]}
        tags <<  Tags.where(id: @ids )
    else
        super
    end
end
我的JSON如下(我只是为标记传递ID):


我也不认为这是必要的。如果您有一个
has_many:tags,则通过此处的:…
关系,然后将标记直接分配给该关系将自动创建中间记录。它实际上非常方便。@tadman我已经有了关系,我只需要区分新的和旧的,用于不同的目的,而不是插入/更新记录。如果您可以将传入的JSON参数与后端中使用的模型相结合,这会容易得多,这种转换是你的控制者的明确责任。将其向下推到模型层会使事情变得非常混乱,模型根本不需要知道参数格式。我已经在这样做了,控制器已经在处理了。但在更新数据时,我需要创建一个自定义验证。我想在其中区分“Tags”集合的新旧记录。这很好,但是模型应该只看到其他模型,而不是任意的JSON结构。您可以使用
@model.tags-@tags
轻松计算哪些标记是新的,您已经使用
@tags=tags.where(id:@ids)
解析了这些标记。你的代码大部分都是正确的,只是放错了地方,使事情复杂化了。您还可以在验证前设置一个
触发器来捕获标记的状态,在保存后设置一个
触发器,如果/当标记被更改时执行操作。
def tags_validator        
    tags.each  do |item| 
        errors.add(:new_record , item.new_record?)
    end
end
{
    "data": {

        "name": "Johnny English",
            "tags" :  
            [   {"id" :3 } , {"id" :4 }    ]
    }
}