【问题标题】:Working with Boolean fields on Mongoid在 Mongoid 上使用布尔字段
【发布时间】:2013-09-12 16:37:28
【问题描述】:

我创建了一个具有布尔字段的模型,但是当捕获它给我的值时,它给了我 1 或 0。我发现这是因为布尔的 BSON 类型是“\x00”和“\x01”。

所以我的问题是,我怎样才能获得该字段的“布尔”值?我是否需要在模型或控制器上执行一个方法,如果值为 1,则返回 true,如果为 0,则返回 false?或者 Mongoid 会为我做这件事吗?

Mongoid 版本: 4.0.0 38de2e9

编辑 蒙哥壳

db.feedbacks.find().limit(1).pretty()
{
  "_id" : ObjectId("52290a2f56de969f8d000001"),
  "like" : "1",
...
}

说明:

我用脚手架创建了一个应用程序:

rails g scaffold 反馈like:Boolean

当我插入一条新记录时,在 Mongo 中,文档保持不变。 当我做 Feedback.first 时,Model 中的字段具有“0”或“1”值。

class Feedback
  include Mongoid::Document
  include Mongoid::Timestamps

  field :comment, type: String

  field :like, type: Boolean


  def isLike?
    like=="1"
  end

end

这是回购: https://github.com/afucher/4kFeedback/blob/master/app/models/feedback.rb

【问题讨论】:

  • 您能添加您的反馈模型的代码吗?
  • 已编辑,同时放入 github repo。
  • 我克隆了 repo,并从 rails 控制台创建了一个反馈实例。一切正常 (feedback=Feedback.create!(like: true) ; feedback.reload ; feedback.like #=> true)
  • 嗯...我想是的,就是scaffold生成的视图上的复选框=/ 复选框的值为0或1,但是我需要在控制器上处理这个??
  • 您是否尝试为视图中的复选框明确指定一个值(比如说“true”或“yes”)?

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

如果您使用 Boolean 类型,Mongoid 会以透明的方式处理它。查看documentation

编辑

从 Rails 控制台(在具有 Indicator 模型的应用程序中定义了 global 类型的字段 Boolean):

Indicator.first.global?
# => true
Indicator.first.global?.class
# => TrueClass

mongo shell 中的等价物:

> db.indicators.find().limit(1).pretty()
{
    "_id" : ObjectId("52319eeb56c02cc74200009c"),
    ...
    "global" : true,
    ...
}

编辑

布尔扩展的spec 清楚地表明,对于MongoDB 端的任何true, "true", "t", "yes", "y", 1, 1.0,您将获得一个TrueClass 实例。 false 也一样。

【讨论】:

  • 在蒙戈呢?文档如何?全球:1 或全球:真??
  • 嗯好的,但是我使用脚手架,我不知道为什么,当我创建一个新文档时,它会创建值为“1”或“0”..
  • 我不确定我是否理解您的问题到底出在哪里,如果是这样,对不起。 BSON 规范规定布尔值存储为\x00\x01。 Mongoid (>=3) 使用 Moped 作为其底层驱动程序,透明地处理 Ruby/BSON 转换。
  • 当然。你用的是什么版本的 Mongoid?
【解决方案2】:

阅读 check_box 文档,我可以解决我的问题: http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box

复选框的默认值为“0”或“1”。要更改此值,只需将您想要的值传递给标签:

check_box(object_name, method, options = {}, checked_value = "1", unchecked_value = "0")

所以,我改成这样:

<%= f.check_box :like,{}, "true", "false" %>

感谢杰夫帮助我!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2019-09-03
    • 1970-01-01
    • 2013-03-22
    • 2020-03-04
    • 1970-01-01
    相关资源
    最近更新 更多