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

所以,我一直在生成不同的脚手架,试图使用塔的一对多关系特性,但我不知道如何实际连接相关实例来利用关系。 例如,我最近的脚手架是这样产生的:

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只是给了我错误。

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

 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:不能调用未定义的方法”创build“。 如果我在模型或控制器中尝试类似的东西,也会发生同样的事情。 我真的被困在这里,并且已经尝试了好几天来弄清楚这是如何工作的,但是我不知道还有什么地方需要注意。 如果有人有示例代码,我可以偷看,这将是可怕的,否则解释的种类也将有所帮助。 谢谢。

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

现在通过方法而不是获取者来访问关系:

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

仅供参考,关系如何构build。 首先,当你做这样的事情时:

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

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

当你做user.posts() ,它会构造一个新的Tower.Model.Relation.HasMany.Scope : /tower/model/relation.coffee#L85 ,它给你所有的finder / persistence方法,就像做App.User.asc('createdAt').all() 。 关系的子类Tower.Model.Scope为了自定义查找/创build/更新/删除方法的关联,这几乎是它。

最后一点,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) -> 

希望有所帮助。