2017-01-23 52 views
0

我有下面的代码红宝石三元运算符不返回预期

@services = [] 
@services << @user.services.where(active: true).blank? ? @user.services.build(active: true) : @user.services.where(active: true).first 

而不是返回服务对象,我得到真正的或阵列假。这是为什么?

+1

运算符优先级可能。尝试把三角括号括起来。 – Carcigenicate

回答

3

正如你可以在这个precedence table看到,<<?高,所以你的代码被解析为:

(@services << @user.services.where(active: true).blank?) ? @user.services.build(active: true) : @user.services.where(active: true).first 

你可以写:

@services = [] 
@services << (@user.services.where(active: true).blank? ? @user.services.build(active: true) : @user.services.where(active: true).first) 

但它不是很可读的,您拨打where两次。

active_services = @user.services.where(active: true) 
service = if active_services.blank? 
      @user.services.build(active: true) 
      else 
      active_services.first 
      end 
@services = [service] 

更新从@ mudasobwa的优秀评论:

@services = [@user.services.where(active: true).first || @user.services.build(active: true)] 

更新从@Stefan,它看起来像你的代码就相当于:

@services = [@user.services.find_or_initialize_by(active: true)] 
+2

'first'返回空'nil','where''永不返回'nil'⇒'@services = [@ user.services.where(active:true).first || @ user.services.build(active:true)]'。 – mudasobwa

+0

@mudasobwa:很好的评论,随时写它作为一个答案。 –

+0

答案是“优先表”,你只是给了它;这是一个小小的改进,不值得自己回答。 – mudasobwa