ruby-on-rails - 键必须是字符串或符号

标签 ruby-on-rails mongoid datamapper

设置:

Ruby on rails 3.2.2
Ruby 1.9.2
dataMapper 1.2.0
mongoid 2.4.8
mongoid_orderable 1.0.0

获取 keys must be strings or symbols使用 mongoid_orderable 时出错。

我认为这与我使用的 dataMapper 有关系,除了 mongid(使用 dataMapper 从另一个服务器移植数据)

我注意到 dataMapper 和 mongoid 之间的冲突,因为它们都使用各种方法扩展 Symbol,asc、desc 等。这可能是同一个问题吗?

如果有帮助,这是我的堆栈跟踪中的一个片段:
keys must be strings or symbols
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/bson-1.6.2/lib/bson/bson_c.rb:24:in `serialize'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/bson-1.6.2/lib/bson/bson_c.rb:24:in `serialize'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongo-1.6.2/lib/mongo/collection.rb:436:in `update'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid-2.4.8/lib/mongoid/collections/master.rb:25:in `block in update'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid-2.4.8/lib/mongoid/collections/retry.rb:29:in `retry_on_connection_failure'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid-2.4.8/lib/mongoid/collections/master.rb:24:in `update'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid-2.4.8/lib/mongoid/collection.rb:149:in `update'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid_orderable-1.0.0/lib/mongoid_orderable/mongoid/contexts/mongo.rb:6:in `inc'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid_orderable-1.0.0/lib/mongoid_orderable/mongoid/criteria.rb:1:in `inc'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid_orderable-1.0.0/lib/mongoid/orderable.rb:125:in `apply_position'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid_orderable-1.0.0/lib/mongoid/orderable.rb:85:in `add_to_list'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/callbacks.rb:419:in `block in _run__3008157942946527494__save__4591629889417243504__callbacks'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/callbacks.rb:215:in `block in _conditional_callback_around_742'

mongoid_orderable 的当前实现如下:
class MyModel
  include Mongoid::Document
  include Mongoid::Orderable
  default_scope order_by(:position => :asc)
end

我很确定它与基于堆栈跟踪的 _mongoid_orderable_ 相关,并且如果我注释掉 _mongoid_orderable_ 相关行,它就可以工作。还提交了一个问题 here

最佳答案

解决了。

就像我一样,它与 mongoid 和 DataMapper 发生了冲突。
更改 mongoid_orderable 中的几行解决了。

如果有人偶然发现这个问题,那是因为 DataMapper 和 Mongoid 都使用像 gte, gt, lt, lte 这样的运算符扩展 Symbol 。等等。

为了避免这种冲突,只需使用 mongoids 替代语法:

代替:

order_by(:created_at.desc)


where(:type.ne => 'Class')

用这个:
order_by(:created_at => :desc)


where(:type => {'$ne' => 'Class'})

关于ruby-on-rails - 键必须是字符串或符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10272452/

相关文章:

ruby-on-rails - 如何成为一名独立的 Ruby 程序员

ruby-on-rails - 在 View 中使用带有 .last 的作用域会返回一个 AssociationRelation

ruby-on-rails - 在Rails中使用回调进行域逻辑的利弊

ruby - 当初始化被包含的模块覆盖时调用父构造函数

ruby-on-rails - Heroku 的 Rails、Mongoid 和 Unicorn 配置

model-view-controller - 使用外部数据源实现域模型和数据映射器模式

database - Data Mapper 可以调用另一个吗?并继承?

java - 用于不同属性的 DynamoDB Mapper 框架

ruby-on-rails - React 组件渲染但在 Rails 应用程序中不可见

ruby-on-rails - 从 redmine 获取 100 多个问题