【问题标题】:MongoMapper - Updating existing records with new keysMongoMapper - 使用新键更新现有记录
【发布时间】:2010-06-29 22:43:21
【问题描述】:

当通过 MongoMapper 向现有模型(使用现有数据)添加键时,我可以使用新键创建新文档,但是当尝试使用相同键访问现有文档时,它会失败,说明它是“未定义的方法”。

我想知道是否有人有任何见解。

提前致谢!

(是的,这些示例被截断了。)

- model.rb -

key :key_1
key :key_2

- would return -
#<Model _id: BSON::ObjectID('4ba821abebddb9094c000001'), key_1: "test", key_2: "test">


- model.rb (updated version) -

key :key_1
key :key_2
key :key_3

- would still only return -
#<Model _id: BSON::ObjectID('4ba821abebddb9094c000001'), key_1: "test", key_2: "test">

- but if a new doc is created - 
#<Model _id: BSON::ObjectID('4ba821abebddb9094c000001'), key_1: "test", key_2: "test">
#<Model _id: BSON::ObjectID('7ba131abedaab9094c007482'), key_1: "test", key_2: "test", key_3: "test">

很好,除了我在尝试访问第一个文档的 :key_3 时收到方法未定义错误。

Rails 2.3.4

MongoMapper 0.7.4

【问题讨论】:

  • Tom,您能否发布代码摘录,因为我在这里没有看到这种行为。哦,你运行的是哪个版本的 MongoDB 和 MongoMapper?

标签: ruby-on-rails ruby mongodb mongomapper


【解决方案1】:

我根本没有看到这种行为,即使在与更新类之前实例化的对象交互时也是如此。在 irb 中运行以下命令时,我没有错误:

>> gem 'mongo_mapper', '0.7.4'
=> true
>> require 'mongo_mapper'
=> true
>> MongoMapper.database = 'test'
=> "test"
>> class Foo
>>   include MongoMapper::Document
>>   key :something
>>   end
=> #<MongoMapper::Plugins::Keys::Key:0x101f8f938 @default_value=nil, @type=nil, @name="something", @options={}>
>> f = Foo.new(:something => 'thing')
=> #<Foo _id: ObjectID('4c4dc9af712337447c000001'), something: "thing">
>> f.save
=> true
>> f
=> #<Foo _id: ObjectID('4c4dc9af712337447c000001'), something: "thing">
>> class Foo
>>   key :something_else
>>   end
=> #<MongoMapper::Plugins::Keys::Key:0x101f6ad90 @default_value=nil, @type=nil, @name="something_else", @options={}>
>> f
=> #<Foo something_else: nil, _id: ObjectID('4c4dc9af712337447c000001'), something: "thing">
>> f.something_else
=> nil

由于您似乎遇到了不寻常的问题,因此您的用例的更多详细信息会有所帮助。你能给我们一个更完整的代码示例吗?如果您在失败的代码中包含专有内容,请将其削减到使其仍然失败所需的最小情况,并发布您的模型的完整声明以及您用来访问它们的代码。

【讨论】:

    【解决方案2】:

    使用 set 命令...

        @model.set(:key_3 => "VALUE...")
        @model.reload
        @model.key_3 # => "VALUE..."
        @model.save
    

    此代码将为您的模型创建一个新字段,确认您已经使用新键进行了定义:

        key :key_3
    

    享受,

    【讨论】:

      猜你喜欢
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多