首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用collection_singular_ids=ids与update_attributes(:collection_ids)

使用collection_singular_ids=ids与update_attributes(:collection_ids)
EN

Stack Overflow用户
提问于 2013-11-05 00:40:28
回答 3查看 868关注 0票数 1

为什么

代码语言:javascript
运行
复制
@thing.tag_ids = params[:thing][:tag_ids]

将关系立即保存到数据库中,但是

代码语言:javascript
运行
复制
@thing.update_attributes(params[:thing][:tag_ids])

如果验证失败了就不会了吗?

代码语言:javascript
运行
复制
@thing.update_attributes(params[:thing][:tag_ids])

等同于

代码语言:javascript
运行
复制
@thing.tag_ids = params[:thing][:tag_ids]
@thing.save

难到不是么?

EN

回答 3

Stack Overflow用户

发布于 2013-11-05 01:14:54

你是对的,以下两个陈述是完全相同的:

代码语言:javascript
运行
复制
# save
@thing.key = value
@thing.save

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

你的代码的问题是你有一个语法问题,你想:

代码语言:javascript
运行
复制
@thing.update_attributes({tag_ids: params[:thing][:tag_ids]})
票数 1
EN

Stack Overflow用户

发布于 2013-11-05 01:41:41

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

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

票数 0
EN

Stack Overflow用户

发布于 2015-04-29 18:16:31

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

代码:

代码语言:javascript
运行
复制
@thing.tag_ids = params[:thing][:tag_ids]

在数据库中进行即席更改,并且不调用验证,因此:

代码语言:javascript
运行
复制
@thing.update_attributes(params[:thing][:tag_ids])

不同于

代码语言:javascript
运行
复制
@thing.tag_ids = params[:thing][:tag_ids]
@thing.save

简而言之:

代码语言:javascript
运行
复制
@thing.tag_ids = params[:thing][:tag_ids] # makes changes in DB w/o validations
@thing.save # runs validations before making changes to DB

我还想知道在使用以下命令时是否可以运行验证:

代码语言:javascript
运行
复制
@instance.collection_singular_ids = other_singular_ids

作为一个快速修复方法,我将覆盖方法添加到父模型(‘东西’)中,如下所示:

代码语言:javascript
运行
复制
def tag_ids=(ids)
  super
rescue ActiveRecord::RecordInvalid => e
  self.errors.add(:base, e.message)
end

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

代码语言:javascript
运行
复制
validates :tag_id, :uniqueness => {:scope => :thing_id}

有谁有更好的解决方法吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19772534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档