【问题标题】:SailsJS through association: how to create association?SailsJS 通过关联:如何创建关联?
【发布时间】:2016-06-12 13:32:49
【问题描述】:

我在 Mac OSX (10.10.5) 上使用 Sails 0.12.3postgresql 9.3.4,我正在尝试实现 through association

我设置了两个模型,第三个模型作为连接表。当我尝试通过创建关系来测试它是否已全部设置时,我收到此错误:

 Uncaught TypeError: Cannot read property 'via' of undefined

Here's my test (mocha/chai) -- 我认为错误实际上出在这种创建关联的方法中(因为如果我为连接创建模型作为一个单独的调用它起作用:

  describe('with orgs', function() {
    beforeEach(function(done) {
      var testEmail = 'sue@test.com';
      var orgName = 'Awesome Org';
      Org.create({name:orgName})
      .then(function(org) {
        return User.create({username:testEmail, orgs:[org]})
      })
      .then(function(user) {
        done()
      })
      .catch(done);
    });
    it('populates empty list of orgs', function(done) {
      console.log('about to call find');
      User.find().populate('orgs')
      .then(function(users) {
        console.log('users', users);
        var user = users[0]
        assert.isNotNull(user.orgs);
        assert.equal(user.orgs.length, 1);
        done();
      })
      .catch(done);
    });
  });

这是我的模型:

User.js:

module.exports = {
  attributes: {
    username : { type: 'email' },
    orgs: {
      collection: 'org',
      via: 'user',
      through: 'orgmembership'
    }
  }
};

Org.js:

module.exports = {
  attributes: {
    name : 'string',
    users: {
      collection: 'user',
      via: 'org',
      through: 'orgmembership'
    }
  },
};

OrgMembership.js:

module.exports = {
  tableName: 'org_membership',
  attributes: {
    user: { model: 'User', columnName: 'user_id', foreignKey: true},
    org: { model: 'Org',  columnName: 'org_id', foreignKey: true}
  }
};

我已经在github 上发布了整个项目。

我发现了这个other stackoverflow question,它似乎在做同样的事情,并试图遵循同样的模式,但它对我不起作用。

我将不胜感激任何指针或建议。谢谢!

【问题讨论】:

  • 看起来这是 Waterline 中的一个错误,并已从 Waterline@0.11.5 开始修补。我对您的项目进行了测试,它按预期工作。

标签: postgresql sails.js waterline


【解决方案1】:

Users.js 应该指 Org.js 中“via”定义中的“users”,同样适用于 OrgMembership.js

module.exports = {
  attributes: {
    username : { type: 'email' },
    orgs: {
      collection: 'org',
      via: 'users',
      through: 'orgmembership'
    }
  }
};

【讨论】:

  • 设计是每个组织成员都应该有一个用户和一个组织,对我来说,在 OrgMembership 中它们是复数是没有意义的。无论如何我都试过了,但它对我不起作用——测试仍然失败。
  • 这是我根据您的建议尝试的更改:github.com/ultrasaurus/sails-many-to-many/commit/…
  • Sails 只是试图引用集合,这是您创建的物理文件“org.js”、“user.js”等,因此“集合”值必须与给定的名称匹配到那个文件。 “via”赋值是表示关联的属性,也应该与模型中明确定义的字段匹配。
  • 感谢您的评论。这似乎与我所做的更改一致,但仍然无效。我错过了什么?
猜你喜欢
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2017-11-12
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多