日期:2014-05-16  浏览次数:20458 次

Rails3.2使用mongoDB学习笔记之mongoid
前段时间写过一个mongo_mapper的demo程序,在写那个测试程序的时候,看见很多人都说mongoid更好,于是打算用一下试试,写了好久了,最近公司比较忙,没时间整理,现在贴出来。

新建项目
rails new spec_mongoid


一、mongonid
   官方首页http://mongoid.org/
  1、安装gem
    Gemfile中添加安装
    gem "mongoid"
    gem "bson_ext"

  2、配置
    执行命令:
    $ rails g mongoid:config

    会在系统中生成一个mongoid的配置文件
    
create  config/mongoid.yml


    如果出现 Could not find a JavaScript runtime.这个错误请在Gemfile中添加
    gem 'execjs'
    gem 'therubyracer'

    修改config/application.rb文件,注释
    # require 'rails/all'

    用下面几行取而代之
    require "action_controller/railtie"
    require "action_mailer/railtie" 
    require "active_resource/railtie"
    require "rails/test_unit/railtie"

   
    把文件environment/development.rb和environment/test.rb中注释掉
    # config.active_record.mass_assignment_sanitizer = :strict 
    # config.active_record.auto_explain_threshold_in_seconds = 0.5
 


    删除database.yml这个文件

    记得加载
    Mongoid.load!("path/to/your/mongoid.yml")


    日志application.rb中添加
    config.mongoid.logger = Logger.new($stdout, :warn)

    关闭日志的方法是在mongoid的配置文件中
     logger: false


  3、语言
    创建config/initializers/mongoid.rb
    添加代码
    Mongoid.add_language("zh-CN")

    如果是支持所有语言的话
    Mongoid.add_language("*")



=======================
问题
我用的全部都是最新版本,绝对的小白鼠阿,遇到了如下恶心问题
host is not a valid option for Mongo::Connection

官方说这是一个bug,需要重新安装这个gem
修改
gem 'mongoid', :git => 'git://github.com/mongoid/mongoid.git'

但是弄完了之后,又出现这个
undefined method `add_language' for Mongoid:Module (NoMethodError)

只好把mongo.rb中的 
#Mongoid.add_language("*")
注释掉
=======================

$ rails g model user
      invoke  mongoid
      create    app/models/user.rb
      invoke    test_unit
      create      test/unit/user_test.rb
      create      test/fixtures/users.yml


上面的命令在执行之后,给user.rb自动加上Mongoid的引用
   class User
     include Mongoid::Document   
   end

随后运行rails console,测试了几个代码
ruby-1.9.2-p180 :003 > User.create(:name=>"李磊")
 => #<User _id: 4f630bf1421aa97127000001, _type: nil, name: "李磊", login: nil, age: nil>
ruby-1.9.2-p180 :002 > user = User.find('4f630bf1421aa97127000001')
 => #<User _id: 4f630bf1421aa97127000001, _type: nil, name: "李磊", login: nil, age: nil> 
ruby-1.9.2-p180 :004 > user.update_attributes(:name=>"李磊",:login=>"lilei",:age=>15)
 => true 
ruby-1.9.2-p180 :005 > user
 => #<User _id: 4f630bf1421aa97127000001, _type: nil, name: "李磊", login: "lilei", age: 15>
 


总体还算是成功

写个单元测试试一试
先把test_helper.rb中的下面代码注释掉
  # fixtures :all

然后在user_test.rb中添加:
# encoding: utf-8
require 'test_helper'

class UserTest <