为什么
@thing.tag_ids = params[:thing][:tag_ids]
在数据库中立即保存关系,但
@thing.update_attributes(params[:thing][:tag_ids])
如果验证失败,不会?
@thing.update_attributes(params[:thing][:tag_ids])
与
相同@thing.tag_ids = params[:thing][:tag_ids]
@thing.save
不是吗?
答案 0 :(得分:1)
你有点正确,以下两个陈述完全相同:
# save
@thing.key = value
@thing.save
# update
@thing.update_attributes({key: value})
您的代码存在的问题是您有语法问题:
@thing.update_attributes({tag_ids: params[:thing][:tag_ids]})
答案 1 :(得分:0)
看来解决方案似乎第一种方法是使用update_attribute来更新单个属性,因此永远不会执行验证。但是在update_attributes的情况下,因为我们知道验证总是被执行
在此处阅读更多内容: - http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_attribute
答案 2 :(得分:0)
我也在努力应对这种行为......
代码:
let json = doc.body();
let arrStudentsData1 = json["JSONs"] as [[String:AnyObject]]
for student1 in arrStudentsData1 {
let arrStudentsData2 = student1["Child"] as [[String:AnyObject]]
println(arrStudentsData2)
}
在DB ad hoc中进行更改,但不会调用验证:
@thing.tag_ids = params[:thing][:tag_ids]
与
不同@thing.update_attributes(params[:thing][:tag_ids])
简而言之:
@thing.tag_ids = params[:thing][:tag_ids]
@thing.save
我还在询问是否有可能在使用时运行验证:
@thing.tag_ids = params[:thing][:tag_ids] # makes changes in DB w/o validations
@thing.save # runs validations before making changes to DB
作为一个快速修复,我将覆盖方法添加到父模型('thing'),如下所示:
@instance.collection_singular_ids = other_singular_ids
和验证器,以防止连接模型中的标签重复,如下所示:
def tag_ids=(ids)
super
rescue ActiveRecord::RecordInvalid => e
self.errors.add(:base, e.message)
end
有没有人有更好的解决方法?