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 -~----------~----~----~----~------~----~------~--~---