【问题标题】:(Mongodb & Datamapper) uninitialized constant DataMapper (NameError)(Mongodb & Datamapper) 未初始化的常量 DataMapper (NameError)
【发布时间】:2013-02-13 13:41:27
【问题描述】:

我尝试在我的项目中使用 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 `': uninitialized constant DataMapper (NameError)”错误。

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

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')

【问题讨论】:

  • 您尝试使用 Datamapper 作为 Mongodb 的 ORM 背后的原因是什么?你试过Mongoid 吗?
  • 我试过 Mongoid,效果很好。事实上,datamapper.org 上提到了 3 个适配器,例如 dm-sqlite-adapter、dm-mysql-adapter、dm-postgres-adapter,而且我也看不到 dm-mongo-adapter。另一方面,使用 dm-mongo-adapter 有什么好处或坏处?

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


【解决方案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,而且您肯定无法利用较新的 MongoDB 功能。

【讨论】:

  • 很高兴,希望对您有所帮助。 DataMapper 是我的关系数据库的首选宝石,我喜欢它。但不幸的是,即使使用此适配器,它也不太适合与 MongoDB 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2016-06-12
相关资源
最近更新 更多