asdlfkjlkj
asdlfkjlkj

Reputation: 2348

Ruby ternary operator not returning as expected

I have following code

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

Instead of returning service object I get true or false in the array. Why is that?

Upvotes: 0

Views: 126

Answers (1)

Eric Duminil
Eric Duminil

Reputation: 54213

As you can see in this precedence table, << is higher than ?, so your code is parsed as :

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

You could write :

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

But it's not very readable, and you call where twice.

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

Update From @mudasobwa's excellent comment :

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

Update From @Stefan, it looks like your code is equivalent to :

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

Upvotes: 3

Related Questions