使用collection_singular_ids = ids vs update_attributes(:collection_ids)

时间:2013-11-04 16:40:28

标签: ruby-on-rails validation save

为什么

@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

不是吗?

3 个答案:

答案 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

有没有人有更好的解决方法?