使用Mongoid上的布尔字段

时间:2013-09-12 16:37:28

标签: ruby-on-rails mongodb mongoid

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

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

Mongoid版本: 4.0.0 38de2e9

修改 Mongo Shell

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

说明:

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

  

rails g scaffold反馈如:Boolean

当我插入新记录时,在Mongo中,文档会让我感到难过。 当我执行Feedback.first时,模型中的字段具有“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

2 个答案:

答案 0 :(得分:4)

如果您使用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个实例。同样的错误。

答案 1 :(得分:0)

我可以解决我的问题,阅读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" %>

谢谢杰夫帮助我!!