我想对模型进行查询,接下来依赖于结果做其他事情问题:
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()
答案 0 :(得分: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
中有一个小错误导致它失败。我在塔的问题列表上发布了这个错误,我也在自己调查,所以希望它能很快正常工作。
希望这有帮助。
编辑:我想提一下,我不完全确定为什么第二个例子失败了,因为它看起来很像我的建议,除非我错了或上下文(@的值)因为在数据库查询中使用@而不是App.User。