Stephen Bannasch
2007-May-10 23:48 UTC
why can''t I save to a join table in a migration or rake task?
I''ve tried to put this in a migration and in a rake task but nothing gets created in the roles_users join table: User.find(:all).each {|u| u.roles << member_role; u.save! } It works fine from script/console. -- - Stephen Bannasch Concord Consortium, http://www.concord.org --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Chris Hall
2007-May-11 01:13 UTC
Re: why can''t I save to a join table in a migration or rake task?
where is member_role coming from? also, the save! is not necessary, as the << method saves the data in the join table. On 5/10/07, Stephen Bannasch <stephen.bannasch-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > I''ve tried to put this in a migration and in a rake task but nothing > gets created in the roles_users join table: > > User.find(:all).each {|u| u.roles << member_role; u.save! } > > It works fine from script/console. > -- > - Stephen Bannasch > Concord Consortium, http://www.concord.org > > > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Stephen Bannasch
2007-May-11 02:58 UTC
why can''t I save to a join table in a migration or rake task?
At 9:13 PM -0400 5/10/07, Chris Hall wrote:>where is member_role coming from? > >also, the save! is not necessary, as the << method saves the data in >the join table.Hi Chris, Here''s is the rake task version. member_role is a local variable with the value of a Role object with the title "member". desc "setup_roles for users." 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 {|u| u.roles << member_role; u.save! } anonymous = User.find_by_login(''Anonymous'') anonymous.roles.each {|r| r.destroy } anonymous.roles << anonymous_role stephen = User.find_by_login(''stephen'') stephen.roles << admin_role end I added the save! just to see if saving the object to which the collection is related would make a difference. It didn''t and I should have deleted it from my example before posting the question. After running the migration listed below and then running the rake task listed above I have just two entries in the table roles_users, one for the anonymous user and one for me. If instead I run these two commands in script/console: member_role = Role.find_or_create_by_title(''member'') User.find(:all).each {|u| u.roles << member_role } The new entries are created in the roles_users joint table for all the users. Here''s the migration I keep running up and down: class AddRolesUsers < ActiveRecord::Migration def self.up create_table "#{RAILS_APPLICATION_PREFIX}roles_users", :id => false, :force => true do |t| t.column "role_id", :integer t.column "user_id", :integer end end def self.down drop_table "#{RAILS_APPLICATION_PREFIX}roles_users" Role.delete_all end end -- - Stephen Bannasch Concord Consortium, http://www.concord.org --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Chris Hall
2007-May-11 10:52 UTC
Re: why can''t I save to a join table in a migration or rake task?
try this replace User.find(:all).each {|u| u.roles << member_role } with User.find(:all).each do |u| p "#{u.roles.size}" u.roles << member_role p "#{u.roles.size}" p "added member role to #{u.name}" end and see what happens On 5/10/07, Stephen Bannasch <stephen.bannasch-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > At 9:13 PM -0400 5/10/07, Chris Hall wrote: > >where is member_role coming from? > > > >also, the save! is not necessary, as the << method saves the data in > >the join table. > > Hi Chris, > > Here''s is the rake task version. member_role is a local variable with the value of a Role object with the title "member". > > desc "setup_roles for users." > 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 {|u| u.roles << member_role; u.save! } > anonymous = User.find_by_login(''Anonymous'') > anonymous.roles.each {|r| r.destroy } > anonymous.roles << anonymous_role > stephen = User.find_by_login(''stephen'') > stephen.roles << admin_role > end > > I added the save! just to see if saving the object to which the collection is related would make a difference. It didn''t and I should have deleted it from my example before posting the question. > > After running the migration listed below and then running the rake task listed above I have just two entries in the table roles_users, one for the anonymous user and one for me. If instead I run these two commands in script/console: > > member_role = Role.find_or_create_by_title(''member'') > User.find(:all).each {|u| u.roles << member_role } > > The new entries are created in the roles_users joint table for all the users. > > Here''s the migration I keep running up and down: > > class AddRolesUsers < ActiveRecord::Migration > def self.up > create_table "#{RAILS_APPLICATION_PREFIX}roles_users", :id => false, :force => true do |t| > t.column "role_id", :integer > t.column "user_id", :integer > end > end > > def self.down > drop_table "#{RAILS_APPLICATION_PREFIX}roles_users" > Role.delete_all > end > end > > > -- > - Stephen Bannasch > Concord Consortium, http://www.concord.org > > > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Stephen Bannasch
2007-May-11 15:20 UTC
why can''t I save to a join table in a migration or rake task?
>try this > >replace > >User.find(:all).each {|u| u.roles << member_role } > >with > >User.find(:all).each do |u| > p "#{u.roles.size}" > u.roles << member_role > p "#{u.roles.size}" > p "added member role to #{u.name}" >end > >and see what happensChris, 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. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---