0

モデルに対してクエリを実行したいのですが、次は結果に応じて別のことを行います

問題:

  exists = false
  App.User.where(email: "example@domain.com").exists (error, exists) =>      
    console.log exists #=> true
  console.log exists #=> false

これが欲しい理由の例:

class App.User extends Tower.Model
  newUser: ->
    exists = false
    App.User.where(email: "some@email.com").exists (error, exists) =>   

    unless exists                 # here is always: exists = false
      @.create
        email: "some@email.com"   # so user is created

私も次のようなことを試しました:

class App.User extends Tower.Model
  newUser: ->
    @.where(email: "some@email.com").exists (error, exists) =>
      unless exists                         # statement works 
        @.create                            # but I can't create an user
          email: "some@email.com"  

        App.User.create                     # also doesn't work
          email: "some@email.com"  

        user = new App.User                 # this also fails
        user.set "email", "some@email.com"
        user.save()
4

1 に答える 1

1

データベースへのクエリは非同期です。つまり、データが戻ってきた後に実行する必要があるコードは、コールバック内にある必要があります。したがって、最初の例でunless existsは、データベース クエリが完了する前に実際に実行されます。それとそれに続くコードを2つのスペースでインデントすると、コールバック内に配置され、意図したとおりに実行されると思います。試す:

class App.User extends Tower.Model
  newUser: ->
    exists = false
    App.User.where(email: "some@email.com").exists (error, exists) =>   

      unless exists                 
        @.create
          email: "some@email.com"

一意性の検証が正しく機能していれば、モデルに一意性の検証を配置するだけで、同じ結果をより簡単に得ることができます。したがって、モデルでは次のようなものになります。

class App.User extends Tower.Model
  @field "email", type: "String"
  @field "firstName", type: "String"
  @field "lastName", type: "String"

  @hasMany "posts"

  @validates 'email', uniqueness: true

  @timestamps()

残念ながら、最近のいくつかの実験に基づくと、uniqueness失敗の原因となる小さなバグがあります。タワーの問題リストにバグを投稿し、自分でも調べているので、すぐに正常に動作することを願っています。

お役に立てれば。

編集:言及したいと思いますが、2番目の例が失敗する理由は完全にはわかりません.2番目の例は私の提案によく似ているためです. App.User の代わりにデータベース クエリ。

于 2012-06-08T17:24:20.280 に答える