【问题标题】:Ruby on Rails + MongoDB and MongoIDRuby on Rails + MongoDB 和 MongoID
【发布时间】:2013-04-10 03:12:08
【问题描述】:

我使用 MongoDB 创建了一个示例数据库,其中包含来自 mongodbs 网站上 JSON 文件的数据 我已经使用以下命令导入了它。 mongoimport --db 测试 --collection zips --file zips.json 数据正在处理中,当我尝试在控制台中搜索数据时,它会显示出来,到目前为止一切顺利。

我的问题是当我尝试将数据库与我的 Rails 应用程序一起使用时。我创建了一个Class,City,代码是这样的。

    class City
       include Mongoid::Document
       field :c, as: :city, type: String
       field :l, as: :loc, type: Array
       field :p, as: :population, type: Integer
       field :s, as: :state, type: String
       field :_id, type: Integer
    end

我的 mongoid.yml 文件看起来像这样

    development:
     # Configure available database sessions. (required)
    sessions:
     # Defines the default session. (required)
    default:
     # Defines the name of the default database that Mongoid can connect to.
     # (required).
    database: exjobb
     # Provides the hosts the default session can connect to. Must be an array
     # of host:port pairs. (required)
    hosts:
      - localhost:27017
    options:

    options:

    test:
     sessions:
      default:
       database: exjobb
       hosts:
        - localhost:27017
       options:
       consistency: :strong
        # In the test environment we lower the retries and retry interval to
        # low amounts for fast failures.
        max_retries: 1
        retry_interval: 0

Activerecord 被禁用。当我启动 Rails 控制台并尝试 City.where... 我得到以下输出。

    City.where(city: "Acmar")
    => #<Mongoid::Criteria
    selector: {"c"=>"Acmar"}
    options:  {}
    class:    City
    embedded: false>

如果我尝试 City.first 则会引发错误

    NoMethodError: undefined method `to_sym' for nil:NilClass
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/sessions.rb:409:in `__evaluate__'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/sessions.rb:357:in `__database_name__'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/sessions.rb:198:in `database_name'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/sessions.rb:429:in `current_database_name'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/sessions.rb:228:in `mongo_session'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/sessions.rb:171:in `collection'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/contextual/mongo.rb:256:in `initialize'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/contextual.rb:48:in `new'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/contextual.rb:48:in `create_context'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/contextual.rb:31:in `context'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/contextual.rb:21:in `rescue in first'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/contextual.rb:19:in `first'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/mongoid-3.1.2/lib/mongoid/finders.rb:117:in `first'
from (irb):1
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/railties-3.2.11/lib/rails/commands/console.rb:47:in `start'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/railties-3.2.11/lib/rails/commands/console.rb:8:in `start'
from /Users/admin/.rvm/gems/ruby-1.9.3-p374/gems/railties-    3.2.11/lib/rails/commands.rb:41:in `<top (required)>'
from script/rails:6:in `require'

我已经上传了我的代码here,请克隆并尝试帮助我,我卡住了。 如您所见,我的数据库不是空的。 http://i.stack.imgur.com/Bho2H.png

【问题讨论】:

  • 为什么要使用 store_in ?
  • 哦,我已经删除了,它来自教程。现在我得到“零”作为答案。但我知道数据库中有数据,当我使用 mongo 控制台时它可以工作..
  • 执行 City.count 和 City.all.to_a 并粘贴回结果 :-)
  • City.count = 0, City.all.to_a = [] 我不明白,我在哪里连接数据库?我以为 MongoID 是为我做的?
  • 那么城市集合是空的伙伴

标签: ruby-on-rails-3 mongodb mongoid mongoid3


【解决方案1】:

Mongoid(使用与 ActiveRecord 类似的映射约定)将类名复数以获取集合名称。看起来您有一个名为 city 的集合,但 Mongoid 会将您的类映射到一个名为 cities 的集合。

您可以覆盖集合名称:

class City
  store_in collection: "city"
end

或者最好还是将您的数据导入到城市集合中。

【讨论】:

  • 我的收藏名为“city”。使用Mongodb控制台时,我可以写db.city.findOne,我不能写db.cities.findOne。你确定这是问题所在?
  • 是的,我想是的。 Mongoid 正在寻找一个名为城市的集合。如果您不想更改数据库,那么尝试将store_in 声明添加到您的模型应该很容易。
  • 它解决了,非常感谢 :) 我之前在我的代码中使用了 store_in,但它被命名为“City”,而不是“city”;)干杯!
猜你喜欢
  • 2021-04-05
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多