1

为什么

@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

不是吗?

4

3 回答 3

1

说得有点对,以下两个陈述完全相同:

# save
@thing.key = value
@thing.save

# update
@thing.update_attributes({key: value})

您的代码的问题是您有语法问题,您想要:

@thing.update_attributes({tag_ids: params[:thing][:tag_ids]})
于 2013-11-04T17:14:54.140 回答
0

我也在为这种行为而苦苦挣扎......

代码:

@thing.tag_ids = params[:thing][:tag_ids]

在 DB ad hoc 中进行更改并且它不调用验证,因此:

@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

我还问是否有可能在使用时运行验证:

@instance.collection_singular_ids = other_singular_ids

作为快速修复,我向父模型(“事物”)添加了覆盖方法,如下所示:

def tag_ids=(ids)
  super
rescue ActiveRecord::RecordInvalid => e
  self.errors.add(:base, e.message)
end

和验证器以防止在连接模型中重复标签,如下所示:

validates :tag_id, :uniqueness => {:scope => :thing_id}

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

于 2015-04-29T10:16:31.350 回答
0

这是解决方案,似乎第一种方法是使用 update_attribute 更新单个属性,因此永远不会执行验证。但是在我们知道的 update_attributes 的情况下,验证总是被执行

在此处阅读更多信息:- http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_attribute

于 2013-11-04T17:41:41.313 回答