【问题标题】:How do I use One-to-Many Relationships in Tower.js?如何在 Tower.js 中使用一对多关系?
【发布时间】:2012-05-25 06:48:27
【问题描述】:

所以,我一直在生成不同的脚手架,尝试使用 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 控制台中,我能够创建一个示例用户并发布(我也可以通过运行服务器并使用网页上的表单来轻松地做到这一点),如下所示:

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

我得到“类型错误:无法调用未定义的方法‘存在’”。同样,调用:

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

产生“TypeError:无法调用未定义的‘create’方法”。如果我在模型或控制器中尝试这样的事情,也会发生同样的事情。我真的被困在这里,并且已经尝试了几天来弄清楚它是如何工作的,但我不知道还能去哪里看。如果有人有我可以偷看的示例代码,那就太棒了,否则各种解释也会有所帮助。谢谢。

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

【问题讨论】:

    标签: node.js coffeescript towerjs


    【解决方案1】:

    现在通过方法而不是 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 以便自定义关联的查找/创建/更新/删除方法,就是这样。

    最后一件事,随着我们使用字段方法(即user.get('email'))对其进行规范化,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) ->
    

    希望对您有所帮助。

    【讨论】:

    • 谢谢,这绝对为我指明了正确的方向。那么,例如,如何让它真正建立个人用户和特定帖子之间的联系呢?
    • 刚刚意识到我没有考虑到数据库调用的异步性质。想象这一直是东西不适合我的最大原因之一......哈哈
    • 搞定了!再次感谢,永远不会想到它作为方法运行,而不是 getter/setter。一旦我有了那块,然后意识到我一直在尝试同步地做所有事情,而不是异步,一切都到位了。很快就会有一个例子,我会回到这里并链接到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多