Reputation: 2348
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
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