0

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.

marcamillion
  • 32,933
  • 55
  • 189
  • 380
  • Well. can you add binding before the `if` and check the return value? Because, inside the `if` block, you are updating the enum value and you are inspecting there... Also show the schema of the table. – Arup Rakshit Feb 06 '16 at 09:01
  • 2
    oooohhh.... @ArupRakshit, you are a genius. DUH. The line right before the `binding.pry` at 210 updates the `membership` record and changes the `relative_type`. That's why it keeps giving me `membership.user? => false` within the block. It was true at the beginning of the block. – marcamillion Feb 06 '16 at 09:06
  • because you have updated it here `membership.update!(member: member, invited: nil, relative_type: 0)` with a new version of type – Малъ Скрылевъ Feb 06 '16 at 09:34

0 Answers0