[英]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
類在owner
類App.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.