Ruby on Rails 프레임워크 프로그램이 MongoDB를 연결하는 자습서

5909 단어 RailsMongoDBRuby
앞에 몬godb의 설치와ror 프로젝트의 구축을 소개합니다. 지금 통합을 진행하겠습니다.
1. 항목 만들기
프로젝트를 만들 때 rails active_ 를 사용하지 않습니다.레코드 지원

rails new todo -O
2. 우리는 MongoMapper를 사용하여 MongoDB를 Rails로 구동할 것이다
GemFile 편집, 다음 내용 추가

gem"mongo_mapper"
그리고 bundle 설치 실행gem

bundle install
3. 데이터베이스 링크 추가
config/initializer 아래에 몬고를 새로 만듭니다.rb 파일, 글로벌 데이터베이스 정보 지정:

MongoMapper.connection = Mongo::Connection.new('localhost', 27017)


MongoMapper.database ='todo'# Rails , , , 


if defined?(PhusionPassenger)

  PhusionPassenger.on_event(:starting_worker_process)do|forked|

    MongoMapper.connection.connectifforked

  end

end

위 단계를 완료한 후 프로그램을 시작합니다.

$ rails server


**Notice: C extension not loaded. This is required for optimum MongoDB Ruby driver performance.

You can install the extension as follows:


gem install bson_ext


If you continue to receive this message after installing, make sure that the

bson_ext gem is in your load path and that the bson_ext and mongo gems are of the same version.

=> Booting WEBrick

=> Rails 3.0.10 application starting in development on http://0.0.0.0:3000

=> Call with -d to detach

=> Ctrl-C to shutdown server

[2011-10-19 23:36:14] INFO WEBrick 1.3.1

[2011-10-19 23:36:14] INFO ruby 1.9.2 (2011-07-09) [x86_64-linux]

[2011-10-19 23:36:14] INFO WEBrick::HTTPServer#start: pid=19595 port=3000

위 출력에서 볼 수 있는 bson_ext 라이브러리가 불러오지 않았습니다.알림에 따라 이 라이브러리를 설치하면 됩니다. (gemfile에 gem을 추가하는 것을 잊지 마십시오.)
프로그램을 다시 시작하면 Notice 알림 메시지가 사라지고 정상적으로 시작됩니다.브라우저에서 다음을 입력합니다.http://127.0.0.1:3000, 아래 페이지를 볼 수 있습니다
4. 페이지 및 처리 논리 추가
rails의generate 명령을 통해 페이지, 컨트롤러, 모델층 파일을 생성합니다 (개인은 수동으로 만드는 것을 좋아합니다. 여기는 프레젠테이션을 위해 편리합니다)

rails generate scaffold project name:string --orm=mongo_mapper

우리는 몬고를 데이터베이스로 사용하기 때문이다.그러면 우리는 Active Record의 모델을 Mongo Mapper의 유형으로 바꾸어야 한다. 즉, 계승 관계를 Active Record::Base에서 Mongo Mapper:::Document로 바꾸어야 한다.우리는 키라는 방법을 사용하여 이 MongoMapper의 필드 속성을 표시합니다.우리의 속성은name이고 이 필드의 형식인 String을 더하면 다음과 같이 정의됩니다.

classProject

  include MongoMapper::Document

  key:name,String

end

이상의 수정을 통해 우리는 이미 모든 추가, 업데이트, 삭제와 목록을 가지고 있다
5. 데이터 보기
명령mongo를 통해mongodb 데이터베이스에 들어가 데이터를 조회할 수 있습니다

mongo // 

use todo // 

db.projects.find() // 


6. 기타
Mongo Mapper와 Active Record는 동일합니다.심지어 Mongo Mapper는 다음과 같이 ActiveRecord를 지원합니다.

validates_presence_of:name
MongoDB에 schema-less (데이터 버전 기록) 가 없기 때문에 우리는 모델의 속성을 쉽게 추가하고 변경할 수 있으며,migrations 작업을 수행할 필요가 없습니다.예를 들어 priority의 속성을 추가해야 합니다. 프로젝트 모델을 다음과 같이 수정하는 것만 필요합니다.

classProject

  include MongoMapper::Document

  key:name,String,:required=>true

  key:priority,Integer

end

표 간의 관련성은 MongoDB에 약간의 차이가 있습니다. 모든 id를 저장하기 위해서는 ObjectId 형식이 필요합니다.
서로 다른 테이블을 처리하기 전의 관련에 대해 우리는 ActiveRecord처럼 belongs_를 정의할 수 있다to, 물론 조금 다르다. 프로젝트에서 우리는 has_를 정의해야 한다many:tasks, Mongo Mapper에서 many로 대체해야 합니다.
나도 지금 여기까지 할게.시간이 있으면 다시 다른 기능을 깊이 연구해라.
PS: Ruby MongoDB 백업 스크립트 작성(fsync & lock)

#!/usr/local/bin/ruby
# date:    06-12-2014
# auther: lucifer
# use fsync and lock to the file-system before backup the file-system
# mongo-ruby-driver version > 1.10.0

require 'mongo'
require 'fileutils'
require 'date'

include Mongo
include BSON

# the members of replcation-set
# test mongodb server version 2.6.0
# host = "192.168.11.51"

# The port of members
# If the port is 27017 by default then otherport don't need to assignment
# otherport = ""
# port = otherport.length != 0 ? otherport : MongoClient::DEFAULT_PORT

# opts = {:pool_size => 5, :pool_timeout => 10}
# Create a new connection
# client = MongoClient.new(host, port, opts)

uri_string = "mongodb://caoqing:[email protected]:27017/admin"
client = MongoClient.from_uri(uri = "#{uri_string}")
db = client['admin']

# fsync and lock the database
cmd = OrderedHash.new
cmd[:fsync] = 1
cmd[:lock] = true
# p cmd
db.command(cmd)

# datafile path
d = "/var/lib/mongo"

# dir = Dir.new("#{d}")
# entries = dir.entries
# entries.delete_if { |entry| entry =~ /^\./}
# convert the relative path to the full path
# entries.map! { |entry| File.join(dir.path, entry) }
# maintain only the type of file
# entries.delete_if { |entry| !File.file?(entry) }
# p entries

start = Date.today.to_s
prev = (Date.today - 7).to_s

dest = "/backup/#{start}"
sour = "/backup/#{prev}"

FileUtils.rm_rf("#{sour}") if File::exist?("#{sour}")

Dir.mkdir("#{dest}", 0755) unless File::exist?("#{dest}")

FileUtils.cp_r Dir.glob("#{d}/**"), dest if client.locked?

puts "*" * 20
puts "\tbackup complete"
puts "*" * 20

# DB::SYSTEM_COMMAND_COLLECTION
# unlock the database
db["$cmd.sys.unlock"].find_one
client.close

좋은 웹페이지 즐겨찾기