草庐IT

mongodb - emberdata 和 mongodb 嵌入式对象 ID 未定义

coder 2023-10-30 原文

我有一个关于 Ember 数据和 Mongodb 嵌入式对象的问题。这是我的模型:

App.Contact = App.Entity.extend({
    name             : DS.attr('string'),
    firstname        : DS.attr('string'),
    additional_names : DS.attr('string'),
    civility         : DS.attr('string'),
    birthday         : DS.attr('date'),
    organization     : DS.belongsTo('App.Organization'),
    role             : DS.attr('string'),
    photo_source     : DS.attr('string'),
    photo_uri        : DS.attr('string'),
    gravatar_mail    : DS.attr('string'),
    addresses        : DS.hasMany('App.Address', { embedded: true }),
    emails           : DS.hasMany('App.Email', { embedded: true }),
    phones           : DS.hasMany('App.Phone', { embedded: true })
});

现在我通过 API 获取联系人:(GET/app/api/v1/contact/4f86c4774ab63c2417000001/) 这是我得到的:

{
    "additional_names": null,
    "addresses": [],
    "birthday": null,
    "civility": null,
    "emails": [
        {
            "email": "alexandre@test.com",
            "label": null,
            "resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/emails/0/",
            "type": "HOME"
        }
    ],
    "firstname": "Alexandre",
    "gravatar_mail": null,
    "groups": [],
    "id": "4f86c4774ab63c2417000001",
    "name": "Simoui",
    "organization": null,
    "phones": [],
    "photo_source": null,
    "photo_uri": "/static/img/nophoto.png",
    "resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/",
    "role": null
}

我的“root”对象有一个 id 但嵌入对象“emails”没有。因为在mongodb中,id不设置在子文档上,而只设置在根文档上。

通过这种方式,ember-data 可以看到“email”对象没有 id,然后它会尝试通过 API 获取完整的对象。例如:GET/app/api/v1/email/set//404(未找到)

为了确定这是赖特问题,我尝试返回带有假 ID 字段的 Mongodb 子文档。喜欢:(查看电子邮件对象的区别)

{
    "additional_names": null,
    "addresses": [],
    "birthday": null,
    "civility": null,
    "emails": [
        {
            "id": 431,
            "email": "alexandre@test.com",
            "label": null,
            "resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/emails/0/",
            "type": "HOME"
        }
    ],
    "firstname": "Alexandre",
    "gravatar_mail": null,
    "groups": [],
    "id": "4f86c4774ab63c2417000001",
    "name": "Simoui",
    "organization": null,
    "phones": [],
    "photo_source": null,
    "photo_uri": "/static/img/nophoto.png",
    "resource_uri": "/app/api/v1/contact/4f86c4774ab63c2417000001/",
    "role": null
}

然后我就没问题了,一切都很好。所以我的问题是:有没有办法解决它?

最佳答案

我已经开始尝试解决方法。我只在只读的基础上使用没有 ID 的嵌入式对象,所以我没有测试保存、创建和适当的模型状态管理(isDirty 等)......但到目前为止,这已经解决了我的类似问题。

不幸的是,我需要修改 ember-data 源。参见 my fork Ember 数据。

我的更改范围涉及修改 DS.hasManyhasAssociation() 函数。我所做的是在访问关联的计算属性第一次返回时注入(inject)假 ID。我在定义 hasAssociation() 的闭包中保留了一个客户端 ID 计数器 injectedIdCounter 以及一个获取 ID 和更新计数器的函数。然后我定义了一个新选项 trueEmbedded,它是一个没有 ID 的嵌入式子文档。每次在关联上调用 get() 时,都会检查元素的 ID,如果 ID 不存在,则注入(inject)一个。如果已添加 ID,则需要调用 set() 以便将修改后的关联存储回父对象。这至少解决了我的问题。这是我的代码。

var injectedIdCounter = 1;
var getInjectedId = function() {
  return injectedIdCounter++;
};

var hasAssociation = function(type, options) {
  options = options || {};

  var embedded = options.embedded,
      findRecord = embedded ? embeddedFindRecord : referencedFindRecord;

  var meta = { type: type, isAssociation: true, options: options, kind: 'hasMany' };

  return Ember.computed(function(key, value) {
    var data = get(this, 'data'),
        store = get(this, 'store'),
        ids, id, association;

    if (typeof type === 'string') {
      type = get(this, type, false) || get(window, type);
    }

    key = options.key || get(this, 'namingConvention').keyToJSONKey(key);
    if (options.trueEmbedded) {
      association = get(data, key);
      var injectedIdCount = 0;
      association.forEach(function(item) {
        if (Ember.none(item.id)) {
          item.id = getInjectedId();
          injectedIdCount++;
        }
      });
      if (injectedIdCount > 0) {
        set(data, key, association);
      }
      ids = embeddedFindRecord(store, type, data, key);
    } else {
      ids = findRecord(store, type, data, key);
    }
    association = store.findMany(type, ids || []);
    set(association, 'parentRecord', this);

    return association;
  }).property().cacheable().meta(meta);
};

你可能会认为嵌入式文档不需要 ID,但 ember-data 首先获取对象的所有 ID,然后获取对象本身的方式,即使对于嵌入式关联,也意味着像这样的一些困惑的解决方案是必须的。

希望这会在 Ember 的 future 版本中得到修复。

干杯, 凯文

关于mongodb - emberdata 和 mongodb 嵌入式对象 ID 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11735858/

有关mongodb - emberdata 和 mongodb 嵌入式对象 ID 未定义的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  3. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  6. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  7. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  8. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  9. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  10. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

随机推荐