2

そのため、Tower の 1 対多の関係機能を使用しようとしてさまざまな足場を生成してきましたが、関連するインスタンスを実際にリンクして関係を利用する方法がわかりません。たとえば、私の最新の足場は次のように生成されました。

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のコードを使用しようとすると、エラーが発生します。

タワー コンソールで、サンプル ユーザーを作成して投稿することができました (サーバーを実行し、Web ページのフォームを使用することで、これを簡単に行うこともできます)。

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: 未定義のメソッド 'exists' を呼び出すことはできません」が表示されます。同様に、次を呼び出します。

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

「TypeError: 未定義のメソッド 'create' を呼び出せません」を生成します。モデルやコントローラーでこのようなことをしようとすると、同じようなことが起こります。私は本当にここで立ち往生しており、これがどのように機能するかを数日間理解しようとしていますが、他にどこを見ればよいかわかりません。誰かが私が覗くことができるサンプルコードを持っていれば、それは素晴らしいでしょう.そうでなければ、ある種の説明も役に立ちます. ありがとう。

[編集: 私の作業例と、手順を説明する詳細な README は、ここにあります: https://github.com/edubkendo/demoApp ]

4

1 に答える 1

1

現在、リレーションはゲッターではなくメソッドを介してアクセスされます。

user.posts().all (error, posts) -> console.log(posts)

メソッドは、のサブクラスであるオブジェクトをposts()返します。「スコープ」は、データベースでクエリを実行できるようにするものです。Tower.Model.Relation.HasMany.ScopeTower.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の関連付けメソッド/ゲッターを定義します: /tower/model/relation.coffee#L85ownerApp.User

を実行するuser.posts()と、新しいTower.Model.Relation.HasMany.Scope: /tower/model/relations.coffee#L85が構築されます。これにより、実行と同じように、すべてのファインダー/永続化メソッドが提供されますApp.User.asc('createdAt').all()。関連付けの検索/作成/更新/削除メソッドをカスタマイズするためのリレーションのサブクラスTower.Model.Scope、それだけです。

最後に、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) ->

それが役立つことを願っています。

于 2012-05-25T18:32:50.467 に答える