thur
thur

Reputation: 1074

Working with Boolean fields on Mongoid

I create a Model that has a Boolean field, but when catch the value it gave me 1 or 0. I discover that it's because BSON type for Boolean is "\x00" and "\x01".

So my question is, how can I get the "boolean" value of the field? Do I need to do a method on a model or a controller that returns me true if value is 1 or false if 0? Or will Mongoid do this for me?

Mongoid Version: 4.0.0 38de2e9

EDIT Mongo Shell

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

Explain:

I create a app with scaffold:

rails g scaffold Feedback like:Boolean

When I insert a new record, in Mongo the Document stay as I sad. When I do Feedback.first, the field like in Model has the "0" or "1" value.

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

  field :comment, type: String

  field :like, type: Boolean


  def isLike?
    like=="1"
  end

end

This is the repo: https://github.com/afucher/4kFeedback/blob/master/app/models/feedback.rb

Upvotes: 1

Views: 5796

Answers (2)

thur
thur

Reputation: 1074

I can resolve my problem, reading the check_box documentation: http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box

The default value of Check Box is "0" or "1". To change this value, is just pass the values that you want to the tag:

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

So, I change to this:

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

Thanks Jef for help me!!

Upvotes: 0

Jef
Jef

Reputation: 5474

Mongoid handles that in a transparent manner if you use the Boolean type. Checkout the documentation.

EDIT :

From the rails console (in an app with an Indicator model defining a field global of type Boolean) :

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

The equivalent from the mongo shell :

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

EDIT

The spec for the Boolean extension clearly shows that for any of true, "true", "t", "yes", "y", 1, 1.0 on the MongoDB side you'll get a TrueClass instance. Same for false.

Upvotes: 4

Related Questions