Ruby 在自定义验证中识别合并对象集合中的新记录
我使用下面的函数合并两个集合,一个来自DB,另一个来自用户输入。我想在验证期间验证哪些记录来自DB,哪些是本地记录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): 我也不认为这是
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 } ]
}
}