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

时间:2012-05-25 06:48:28

标签: 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:无法调用方法'创建'未定义”。如果我在模型或控制器中尝试这样的事情,就会发生同样的事情。我真的被困在这里,并且已经尝试了几天来弄清楚它是如何工作的,但我不知道在哪里可以看。如果有人有我可以查看的示例代码,那将是非常棒的,否则对各种解释也会有所帮助。感谢。

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

1 个答案:

答案 0 :(得分:1)

现在通过方法而非吸气剂访问关系:

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类的关联方法/ getters,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是为了自定义关联的查找/创建/更新/删除方法,这就是它。

最后,随着我们使用字段方法(即user.get('email'))对api进行标准化,api将在接下来的几周内进行更改。很快,它会是这样的:

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) ->

希望有所帮助。