(Mongodb& Datamapper)未初始化的常量DataMapper(NameError)

时间:2013-02-13 13:41:28

标签: ruby-on-rails ruby mongodb datamapper ruby-datamapper

我尝试在我的项目中使用datamapper和mongoid。我关注了https://github.com/solnic/dm-mongo-adapter链接。但没有那么多信息。我在这篇文章中同化了datamapper和sqlite3适配器:http://net.tutsplus.com/tutorials/ruby/ruby-for-newbies-working-with-datamapper/ sqlite3一切正常,但我和mongodb陷入困境。

当我在控制台中运行“ruby rm.db”时,我采取“dm.rb:1:in`':未初始化的常量DataMapper(NameError)”错误。

我该如何解决这个问题? 我在下面的gemfile中添加了这些宝石:

dm-core
dm-aggregates
dm-migrations
mongo
mongodb
mongo_ext 

然后我在代码中添加了名为 dm.rb 的文件中的代码。

DataMapper.setup(:default,
  :adapter  => 'mongo',
  :database => 'my_mongo_db',
)

# Define resources
class Student
  include DataMapper::Mongo::Resource

  property :id, ObjectId
  property :name, String
  property :age, Integer
end

class Course
  include DataMapper::Mongo::Resource

  property :id, ObjectId
  property :name, String
end

# No need to (auto_)migrate!
biology = Course.create(:name => "Biology")
english = Course.create(:name => "English")

# Queries
Student.all(:age.gte => 20, :name => /oh/, :limit => 20, :order => [:age.asc])

# Array and Hash as a property
class Zoo
  include DataMapper::Mongo::Resource

  property :id, ObjectId
  property :opening_hours, Hash
  property :animals, Array
end

Zoo.create(
  :opening_hours => { :weekend => '9am-8pm', :weekdays => '11am-8pm' },
  :animals       => [ "Marty", "Alex", "Gloria" ])

Zoo.all(:animals => 'Alex')

1 个答案:

答案 0 :(得分:1)

我将以两部分为您解答。

首先,为了解决您当前的问题,问题是在您尝试使用DataMapper之前,它看起来并不像您需要的那样。您可以在rb文件的顶部要求dm-mongo-adapter,或者由于您使用的是Bundler,您实际上可以直接在Gemfile中执行此操作。

# add this to the beginning of your dm.rb file
require 'dm-mongo-adapter'

# or put this in your Gemfile, run with `bundle exec dm.rb`
gem 'dm-mongo-adapter', :require => true

其次,关于使用dm-mongo-adapter。这种方法存在一些问题,这些问题可能会让您现在和将来都感到头疼。

  1. MongoDB不使用SQL语法进行查询,它是一个非关系型数据库。 DataMapper尽管很棒,完全基于SQL作为查询语言,其所有API和文档建模助手都是在考虑关系数据建模的情况下设计的。

    您正在使用的mongo适配器旨在尝试为习惯于SQL语法的开发人员弥补这一差距,但这两种方法之间的差异非常大,以至于您可能会因为查询不佳而导致性能不佳,糟糕的索引和糟糕的数据模型,这些模型并非真正设计用于像MongoDB这样的数据库。

    我强烈建议您查看MongoidMongo Mapper(或仅使用mongo gem本身),而不是采用此方法。

    另外,你应该查看10gen的网站,其中有很多关于MongoDB与传统关系数据库的区别以及为什么在构建你的应用程序之前理解这些差异非常重要的好的会谈和演示。

    http://www.10gen.com/presentations/building-your-first-app-introduction-mongodb-0 http://www.10gen.com/presentations/schema-design-4

  2. 如果您查看github dm-mongo-adapter,它似乎在一年内没有更新。这可能与我刚刚写的内容有很大关系,但也会引起自己的麻烦。您甚至不可能成功使用旧版本的MongoDB版本,但您肯定无法利用较新的MongoDB功能。