【问题标题】:Towerjs model finders - variable scopesTowerjs 模型查找器 - 变量范围
【发布时间】:2012-06-08 11:02:00
【问题描述】:

我想查询模型,然后根据结果做其他事情

问题:

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

【问题讨论】:

    标签: towerjs


    【解决方案1】:

    对数据库的查询是异步的,这意味着您需要在数据返回后运行的任何代码都必须在回调中。因此,在您的第一个示例中,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 中有一个小错误导致它失败。我在 Tower 的问题列表中发布了这个错误,我自己也在研究它,所以希望它很快就会正常工作。

    希望这会有所帮助。

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

    【讨论】:

    • 并没有真正找到您在这里遇到的问题的根源,但我确实得到了一个 pull request 用于唯一性验证器,这将是获得您正在尝试的功能的一种方法进入这个特定的例子。所以要留意它。
    • 是的,我也遇到了唯一性问题。这个拉取请求会很有帮助:)我也很惊讶第二个例子不起作用。我做了几次,但我会再次进行代码修订。也许我搞砸了什么。谢谢解释,问候!
    • 好的,第二个例子有效。不知道怎么样。有些事情搞砸了,但它已经解决了。话题关闭。谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2022-10-17
    • 2019-09-10
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多