Why would a truthy check on an enum value not work like I expect?

178 Views Asked by At

On my membership model, I have the following enum value:

enum relative_type: { member: 0, user: 1 }

Then elsewhere in some code, when it comes upon a membership model, I have this if-branch

      if membership.user?
        member = Member.create(first_name: self.first_name, last_name: self.last_name, email: self.email, bio: self.bio, gender: self.gender, avatar: self.avatar, birthday: self.birthday, deceased: false)
        membership.update!(member: member, invited: nil, relative_type: 0)
        binding.pry
        membership.inviter_connection.update!(request_status: 3)
      end

The weird thing is for attributes where membership.user? returns false, execution still gets passed inside the if block.

Here is an example of the a pry session.

    207:           if membership.user?
    208:             member = Member.create(first_name: self.first_name, last_name: self.last_name, email: self.email, bio: self.bio, gender: self.gender, avatar: self.avatar, birthday: self.birthday, deceased: false)
    209:             membership.update!(member: member, invited: nil, relative_type: 0)
 => 210:             binding.pry
    211:             membership.inviter_connection.update!(request_status: 3)
    212:           end
    213:         end
    214:       else
    215: 

[1] pry(#<User>)> membership.user?
=> false
[2] pry(#<User>)> membership
=> #<Membership id: 11045, family_tree_id: 76631, user_id: 31643, created_at: "2016-02-06 08:16:54", updated_at: "2016-02-06 08:18:08", relation: "brother", member_id: 9872, invited_id: nil, relative_type: 0>
[3] pry(#<User>)> membership.relative_type
=> "member"
[4] pry(#<User>)> membership.member?
=> true

So from the membership object above, you can see that the membership.relative_type is equal to 0, which corresponds to member. So that works like you would expect, particularly given that membership.member? returns true.

What I don't understand is....in this current instance, why on earth is this instance of PRY being executed from within the if block that should only be executed if membership.user? is true....yet is clearly false here.

Edit 1

The weird thing is that I edited the method to be more explicit, like so:

if membership.user? == true

But it still sends the execution into the if-block even when membership.user? is false.

    207:           if membership.user? == true
    208:             member = Member.create(first_name: self.first_name, last_name: self.last_name, email: self.email, bio: self.bio, gender: self.gender, avatar: self.avatar, birthday: self.birthday, deceased: false)
    209:             membership.update!(member: member, invited: nil, relative_type: 0)
 => 210:             binding.pry
    211:             membership.inviter_connection.update!(request_status: 3)
    212:           end
    213:         end
    214:       else
    215: 

[1] pry(#<User>)> membership.user?
=> false
[2] pry(#<User>)> membership.user?
=> false
[3] pry(#<User>)> membership.member?
=> true

Edit 2

I even took it a step further and compared the actual values of the enum, like so:

    207:           if membership.relative_type == 'user'
    208:             member = Member.create(first_name: self.first_name, last_name: self.last_name, email: self.email, bio: self.bio, gender: self.gender, avatar: self.avatar, birthday: self.birthday, deceased: false)
    209:             membership.update!(member: member, invited: nil, relative_type: 0)
 => 210:             binding.pry
    211:             membership.inviter_connection.update!(request_status: 3)
    212:           end
    213:         end
    214:       else
    215: 

[1] pry(#<User>)> membership
=> #<Membership id: 11049, family_tree_id: 76639, user_id: 31647, created_at: "2016-02-06 08:41:59", updated_at: "2016-02-06 08:42:02", relation: "brother", member_id: 9874, invited_id: nil, relative_type: 0>
[2] pry(#<User>)> membership.relative_type
=> "member"

But still no dice.

0

There are 0 best solutions below