node.js - 如何在 Tower.js 中使用一对多关系?

标签 node.js coffeescript towerjs

因此,我一直在生成不同的脚手架,尝试使用 Tower 的一对多关系功能,但我不知道如何实际链接相关实例以利用该关系。例如,我最近的脚手架是这样生成的:

tower generate scaffold User email:string firstName:string lastName:string hasMany:posts

tower generate scaffold Post title:string body:text userId:integer belongsTo:user

现在,在 Rails 中,post 模型上的 userId 字段将与共享该 id 的用户形成连接,然后您可以使用它来访问该关系。但在这里它似乎没有做任何事情。尝试使用此处的任何代码:https://github.com/viatropos/tower/wiki/1-n只是给我错误。

在塔式控制台中,我能够创建一个示例用户并发布内容(我也可以通过运行服务器并使用网页上的表单来轻松完成此操作),如下所示:

tower> user = new App.User

tower> user.attributes = { email: "bill@bill.com", firstName: "bill", lastName: "billiams" }

tower> post = new App.Post

tower> post.attributes = { title: "A Post", body: "This is a short post.", userId: "4fbf23224503fe670e000006" }

这些实例被保存到数据库中,但是当我尝试如下代码时:

tower> user.get('posts').exists()

我收到“TypeError:无法调用未定义的‘存在’方法”。同样,调用:

tower> user.get('posts').create(title: 'Berlin never sleeps.')

产生“TypeError:无法调用未定义的方法‘create’”。如果我在模型或 Controller 中尝试类似的事情,也会发生同样的事情。我真的被困在这里,几天来一直在尝试弄清楚这是如何工作的,但我不知道还能去哪里寻找。如果有人有我可以看一下的示例代码,那就太棒了,否则某种解释也会很有帮助。谢谢。

[编辑:我的工作示例以及解释步骤的详细自述文件可以在这里找到:https://github.com/edubkendo/demoApp ]

最佳答案

现在关系是通过方法而不是 getter 访问的:

user.posts().all (error, posts) -> console.log(posts)

posts()方法返回 Tower.Model.Relation.HasMany.Scope对象,它是 Tower.Model.Scope 的子类。 “范围”允许您对数据库进行查询:

user.posts().where(title: /a/).asc('createdAt').all()

以下是建立关系的方式,仅供引用。首先,当您执行以下操作时:

class App.User extends Tower.Model
  @hasMany 'posts'

@hasMany 'posts'转到/tower/model/relations.coffee#L50 ,它构造了一个 Tower.Model.Relation.HasMany对象,它扩展 Tower.Model.RelationTower.Model.Relation类定义 owner 上的关联方法/getter类,App.User : /tower/model/relation.coffee#L85 .

当你这样做时user.posts() ,它构造了一个新的 Tower.Model.Relation.HasMany.Scope : /tower/model/relations.coffee#L85 ,它为您提供所有查找器/持久性方法,与 App.User.asc('createdAt').all() 相同。关系子类Tower.Model.Scope为了自定义关联的查找/创建/更新/删除方法,仅此而已。

最后一件事,API 将在接下来的几周内发生变化,因为我们使用字段方法(即 user.get('email') )对其进行规范化。很快,它就会变成这样:

user.get('posts').all()
user.posts.all() # a getter, if getter/setter support is available in the browser, and it is available in node.js

但是现在,使用这个:

user.posts().all (error, posts) ->

希望有帮助。

关于node.js - 如何在 Tower.js 中使用一对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10749758/

相关文章:

node.js - RailJS 与 TowerJS

javascript - 数据库支持的工作队列

node.js - 如何用NodeJS的supertest测试GET请求的路径参数?

javascript - 检测原始数据的变化

Coffeescript for 循环

javascript - Backbone Marionette : Router Not Routing Correctly

node.js - nodejs如何动态加载资源javascript文件

javascript - querySelectorAll 在 Rails 5 中不起作用

node.js - 将 Ember.js 与 Node.js 集成 (Express+Tower.js)

node.js - 安装塔式模块时出现问题 - ws 模块崩溃