簡體   English   中英

如何在Tower.js中使用一對多關系?

[英]How do I use One-to-Many Relationships in Tower.js?

因此,我一直在嘗試使用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中,帖子模型上的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'”。 如果我在模型或控制器中嘗試類似的操作,也會發生同樣的事情。 我真的被困在這里,並且已經嘗試了好幾天來弄清楚它是如何工作的,但是我不知道還有什么地方。 如果任何人都有我可以看到的示例代碼,那將是非常棒的,否則進行各種解釋也將很有幫助。 謝謝。

[編輯:我的工作示例以及詳細的自述文件解釋了這些步驟,可以在這里找到: 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()

僅供參考,這里是建立關系的方式。 首先,當您執行以下操作時:

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

@hasMany 'posts'轉到/tower/model/relations.coffee#L50 ,該對象構造一個Tower.Model.Relation.HasMany對象,該對象擴展了Tower.Model.Relation Tower.Model.Relation類在ownerApp.User上定義關聯方法/ App.User/tower/model/relation.coffee#L85

當執行user.posts() ,它將構造一個新的Tower.Model.Relation.HasMany.Scope/tower/model/relations.coffee#L85 ,它為您提供所有查找程序/持久性方法,與執行App.User.asc('createdAt').all()相同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) ->

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM