Forum: Ruby on Rails why can't I save to a join table in a migration or rake tas

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
6f608b6766f79343062a2aa3985933dc?d=identicon&s=25 Stephen Bannasch (Guest)
on 2007-05-11 17:21
(Received via mailing list)
>  u.roles << member_role
>  p "#{u.roles.size}"
>  p "added member role to #{u.name}"
>end
>
>and see what happens

Chris,

Thanks so much for providing another set of eyes. I took your suggestion
and expanded on it. Quickly here was the problem:

  anonymous.roles.each {|r| r.destroy }

What that actually does is delete all the roles_users associations that
point to the any roles the anonymous user has:

This is the command that does what I intended:

  anonymous.roles.delete_all

For anybody else that finds this email in the future here's what I put
in the rake task to help me debug the problem:

  task :setup_roles => :environment do
    anonymous_role = Role.find_or_create_by_title('anonymous')
    member_role = Role.find_or_create_by_title('member')
    mananger_role = Role.find_or_create_by_title('manager')
    author_role = Role.find_or_create_by_title('author')
    admin_role = Role.find_or_create_by_title('admin')
    User.find(:all).each do |u|
      puts "\n--#{u.name}--"
      puts "  roles: size: #{u.roles.size}"
      u.roles << member_role
      puts "  added member role to #{u.name}: u.roles << member_role"
      puts "  roles: size: :#{u.roles.size}"
    end
    puts "\n1: Checking Users for Roles:"
    User.find(:all).each do |u|
      puts "\n--#{u.name}--"
      puts "  roles: size: #{u.roles.size}"
    end
    anonymous = User.find_by_login('Anonymous')
    anonymous.roles.each {|r| r.destroy } # *** this is the problem ***
    anonymous.roles << anonymous_role
    stephen = User.find_by_login('stephen')
    stephen.roles << admin_role
    puts "\n2: Checking Users for Roles:"
    User.find(:all).each do |u|
      puts "\n--#{u.name}--"
      puts "  roles: size: #{u.roles.size}"
    end
  end

On the first loop I got output like this:

--Anonymous User--
  roles: size: 0
  added member role to Anonymous User: u.roles << member_role
  roles: size: :1

--Stephen Bannasch--
  roles: size: 0
  added member role to Stephen Bannasch: u.roles << member_role
  roles: size: :1

--Carolyn Staudt--
  roles: size: 0
  added member role to Carolyn Staudt: u.roles << member_role
  roles: size: :1

...

Everything still looks fine right after that:

1: Checking Users for Roles:

--Anonymous User--
  roles: size: 1

--Stephen Bannasch--
  roles: size: 1

--Carolyn Staudt--
  roles: size: 1

...

But at the end it looks like this:

2: Checking Users for Roles:

--Anonymous User--
  roles: size: 1

--Stephen Bannasch--
  roles: size: 1

--Carolyn Staudt--
  roles: size: 0

...

All the roles_users associations I made for the Users are gone.
This topic is locked and can not be replied to.