私は実装するクラスを持っています
module CanBePublished
def self.included(o)
o.class_eval do
field :public, type: Boolean, default: false
scope :published, -> { where(public: true) }
end
end
end
コンソール セッションで何が起こるかを確認します。
[1] pry(main)> Portfolio.published.first
=> nil
[2] pry(main)> Portfolio.first
=> #<Portfolio _id: 5391fbc5c1e3dfcf02000001, index: -1, public: "1", title: "test", _slugs: ["test"], description: "portfolio *description*">
[3] pry(main)> Portfolio.where(public: 1)
=> #<Mongoid::Criteria
selector: {"public"=>true}
options: {}
class: Portfolio
embedded: false>
[4] pry(main)> Portfolio.where(public: true)
=> #<Mongoid::Criteria
selector: {"public"=>true}
options: {}
class: Portfolio
embedded: false>
[5] pry(main)> Portfolio.where(public: "1")
=> #<Mongoid::Criteria
selector: {"public"=>true}
options: {}
class: Portfolio
embedded: false>
[1] これらのクエリはすべて nil を返します。[2] は、クエリから返されるはずの既存のオブジェクトがあることを示しています。
クエリは常にブール句で正しく変換されているようですが、dbでは値が文字列として保持されているため、ブール値と一致しません(私の印象)。
[36] pry(main)> p1 = Portfolio.create({title: 'with params', public: '1'})
=> #<Portfolio _id: 53922082c1e3dfebb9000002, index: -1, public: "1", title: "with params", _slugs: ["with-params"], description: nil>
[38] pry(main)> p1.save
=> true
[39] pry(main)> p1.public == true
=> false
どういうわけか、モンゴイドまたはモンゴは「1」を真に変換していません。
[40] pry(main)> p2 = Portfolio.create({title: 'with params2', public: true})
=> #<Portfolio _id: 5392211ec1e3dfebb9000003, index: -1, public: true, title: "with params2", _slugs: ["with-params2"], description: nil>
[41] pry(main)> p2.save
=> true
[42] pry(main)> p2.public == true
=> true
mongod --version db バージョン v2.6.1
モンゴイド 4.0.0