我有下面的代码红宝石三元运算符不返回预期
@services = []
@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
而不是返回服务对象,我得到真正的或阵列假。这是为什么?
正如你可以在这个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)]
运算符优先级可能。尝试把三角括号括起来。 – Carcigenicate