在Knockoutjs中使用引用过滤器的CloudKit JS顺序查询

时间:2015-12-02 01:05:29

标签: javascript knockout.js cloudkit cloudkit-web-services

在网站上工作是对iOS应用程序的补充,我缺乏javascript知识,我可以使用一些指导。

我的CloudKit数据库至少有两个recordTypes:Events和Organization,每个都有多个字段。组织recordType包含对特定事件recordNames的引用。我正在尝试编写一个顺序查询,以便在调用每个事件后,其recordName将用于过滤组织的查询,以便我可以获取引用该事件的组织的相关名称,徽标等字段。

此方法适用于iOS代码(XCode 7,Swift 2)。我可以成功调用knockoutjs代码中的每个recordType,所以我知道对db的访问是正常的。

下面的代码当前是为第一个函数(fetchRecords)设置的,用于调用第二个函数(fetchRecords2),然后合并两组记录。我确定这是一个糟糕的结构,但我已经尝试了不同的方法,现在有点迷失。

md-select

HTML调用如下:

Month ~ date_part('Month', data_compra) as mes, 
Year ~ date_part('Year', data_compra),
Client Name ~ nome_cliente

我看到所有的事件字段(前四个),但organization_name(来自组织recordType)导致出现错误。

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

根据您的描述,您看起来有以下架构:

  1. 记录类型“组织”(带有一个或多个CKReference字段到事件)
  2. 记录类型“事件”
  3. 我的建议是颠倒这种关系,即:

    1. 记录类型“组织”
    2. 记录类型“事件”(带有CKReference字段到组织)
    3. 这为您带来以下好处:

      • 您可以查询事件,然后为每个事件获取组织。
      • 您可以使用参考操作:
        • 'VALIDATE':CloudKit确保事件引用的组织存在
        • 'DELETE_SELF':CloudKit会在删除组织时删除所有相关事件
      • 添加新活动,不会更改组织的recordChangeTag

      示例 - 查询事件,然后获取组织:

      var organizations = {};
      function getOrCreateOrganizationObject(orgRecordName) {
         if(!organizations[orgRecordName]) {
             //You'll want to create the new object the Knockout way
             organizations[orgRecordName] = {};
         }
         return organizations[orgRecordName];
      }
      
      //Query for events
      publicDB.performQuery({recordType: 'Event'})
          .then(function(response) {
              var orgNamesToLookup = [];
              var events = response.records.map(function(record) {
                  var orgRecordName = record.fields.organization.value.recordName;
      
                  var organization = getOrCreateOrganizationObject(orgRecordName);
      
                  var event = {
                      recordName: record.recordName,
                      title: record.fields.event_title.value,
                      date: record.fields.date_of_event.value,
                      rating: record.fields.event_ratings.value,
                      //Note: You probably need some additional plumbing
                      //      for this to work with Knockout
                      organization: organization
                  };
                  return event;
              });
      
              //You can already show the list of events at this point, e.g.
              //something like: self.events(events)
      
              var orgRecordNames = Object.keys(organizations);
              return publicDB.fetchRecords(orgRecordNames)
                  .then(function(response) {
                      response.records.forEach(function(orgRecord) {
                          var organization = getOrCreateOrganizationObject[orgRecord.recordName];
                          organization.name = orgRecord.fields.name.value;
                      });
                  });
          })
      

      然后,在你的HTML中,你会有这样的东西:

      <div data-bind="foreach: events">
        <div class="display">
          <h3><span data-bind="text: recordName"></span></h3> 
          <h3><span data-bind="text: event_title"></span></h3>
          <h3><span data-bind="text: date_of_event"></span></h3>
          <h3><span data-bind="text: event_ratings"></span></h3> 
          <h3><span data-bind="text: organization.name"></span></h3>                         
        </div>
      </div>
      

      HTH

      PS:在真正的应用程序中,您还希望处理错误以及当初始查询中返回的事件多于获取时的情况。