Towerjs 模型查找器 - 可变范围



我想对模型进行查询,接下来依靠资源做其他事情

问题:

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

对数据库的查询是异步的,这意味着在数据返回后需要运行的任何代码都必须在回调中。因此,在第一个示例中,该unless exists实际上将在数据库查询完成之前运行。 我认为如果你缩进它和它后面的代码两个空格,它会把它放在回调中,它会按预期运行。尝试:

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有一个小错误导致它失败。 我将该错误发布在塔的问题列表中,我也在自己调查它,所以希望它很快就会正常工作。

希望这有帮助。

编辑:我想我会提到,我不完全确定为什么第二个示例失败,因为它看起来很像我的建议,除非我错了或者上下文(@的值)由于在数据库查询中使用@而不是App.User而更改。

最新更新