首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >蒙哥德采摘-不返回模型中默认值的正确值

蒙哥德采摘-不返回模型中默认值的正确值
EN

Stack Overflow用户
提问于 2016-04-01 10:16:38
回答 1查看 593关注 0票数 0

我有一个用户模型,其中有一个部门字段,它的默认值是"Engineering“。

这个领域是在我们的网站上线2个月后推出的,自从它的mongo之后,就没有迁移了。

当我尝试使用where获取对象时,将返回正确的值。

代码语言:javascript
运行
复制
 User.find_by(:name => "John).department

但是,如果我试图提取值,它将返回零,而不是默认值。

代码语言:javascript
运行
复制
 User.limit(2).pluck(:department)

返回

代码语言:javascript
运行
复制
[nil,"Finance"]

我研究了一下,发现了一篇博文http://ahmadsherif.com/blog/2013/01/29/mongoid-default-fields-can-give-you-hard-time/

我想我也面临着同样的问题。有这方面的工作吗?我选择使用pluck,因为它不是内存密集型的,而且节省时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-01 11:00:57

基本上,这里的行为可以通过MongoDB处理默认值与传统关系数据库(如Postgres )的区别来解释。

在SQL世界中,您通过数据库模式设置默认值,每次插入一行时,DB都会填充一个空字段。

由于MongoDB是无模式的,文档字段的默认值为nil,因此不能更改*因为没有模式可以在数据库级别上定义默认值。相反,缺省值是在应用程序级别上实现的。对于Mongoid,这意味着当您初始化一个新的模型实例时,如果它们是零,它将填充默认值。

从ActiveRecord的角度来看,它应该是这样的:

代码语言:javascript
运行
复制
class Thing < ActiveRecord::Base
  after_initialize :set_default_foo, if: -> { self.foo.nil? }

  private 
    def set_default_foo
      self.foo = "bar"
    end
end

但是,如果您有现有文档并添加了一个新字段或默认为现有字段,Mongoid将不会为您更新现有文档!

这又如何解释这两个案子呢?

代码语言:javascript
运行
复制
User.find_by(:name => "John").department
User.limit(2).pluck(:department)

在第一种情况下,您需要从存储中提取一个文档,并使用它来将模型实例初始化。初始化模型实例时,将运行回调,该回调设置默认值。

.pluck被调用时,Mongoid直接从存储中提取值,而不初始化任何模型实例。因此,对于任何“遗留”文档,它都将返回一个零值。

要解决这个问题,您需要为任何带有零的文档设置默认值。

代码语言:javascript
运行
复制
User.where(department: nil).update_all(department: 'engineering')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36353723

复制
相关文章

相似问题

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