如何在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.Relation
。 Tower.Model.Relation
类定义了owner
类App.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) ->
希望有所帮助。