Oh also "Item.reset_column_information" needs to be after the
add_column and before the Item.all.each if you are adding the column
and manipulating the data in the same migration. If it is 2 separate
migrations, just put it at the top of the 2nd one.

Jarin Udom
Robot Mode LLC
http://robotmo.de

On Feb 11, 1:30 pm, Jarin Udom <ja...@robotmo.de> wrote:
> You need to put "Item.reset_column_information" at the top of the
> migration so Rails reloads the altered table.
>
> Jarin Udom
> Robot Mode LLChttp://robotmo.de
>
> On Feb 11, 12:58 pm, Adam Stegman <adam.steg...@gmail.com> wrote:
>
>
>
> > I tried doing the whole thing in one migration - adding the column and
> > setting the value, and I got the exact same behavior with this
> > migration:
>
> > class AddActiveToItems < ActiveRecord::Migration
> >   def self.up
> >     add_column :items, :active, :boolean
> >     Item.all.each do |item|
> >       if item.item_status == Item::STATUS_REVIEW or item.item_status
> > == Item::STATUS_IN_PROGRESS
> >         item.active = false
> >       else
> >         item.active = true
> >       end
> >       item.save!
> >       puts "id: #{item.id}, active: #{item.active}"
> >       puts "id: #{item.id}, active: #{Item.find(item.id).active}"
> >     end
> >   end
>
> >   def self.down
> >     remove_column :items, :active
> >   end
> > end
>
> > for db:migrate:
> > id: 1, active: true
> > id: 1, active:
>
> > for db:migrate:up:
> > id: 1, active: true
> > id: 1, active: true
>
> > There must be something weird about this data manipulation.
>
> > On Feb 11, 1:35 pm, Adam Stegman <adam.steg...@gmail.com> wrote:
>
> > > Sorry, I should have mentioned - the migration before it is one where
> > > that active column is added. The migration after alters a column in a
> > > different table. The column is definitely added before this migration
> > > runs.
>
> > > On Feb 11, 1:23 pm, Adam Stegman <adam.steg...@gmail.com> wrote:
>
> > > > I have a migration that saves correctly to the database when it's run
> > > > by itself through db:migrate:up, but not when it's run with other
> > > > migrations through db:migrate.
>
> > > > class SetActiveOnExistingItems < ActiveRecord::Migration
> > > >   def self.up
> > > >     Item.all.each do |item|
> > > >       if item.item_status == Item::STATUS_REVIEW
> > > >         item.active = false
> > > >       elsif item.item_status == Item::STATUS_IN_PROGRESS
> > > >         item.active = false
> > > >       else
> > > >         item.active = true
> > > >       end
> > > >       puts "setting item_id = #{item.id} to active = #{item.active}"
> > > >       item.save!
> > > >       puts "setting item_id = #{item.id} to active = #{item.active}"
> > > >       item = Item.find(item.id)
> > > >       puts "setting item_id = #{item.id} to active = #{item.active}"
> > > >     end
> > > >   end
>
> > > >   def self.down
> > > >     Item.all.each {|item| item.active = nil; item.save(false)}
> > > >   end
> > > > end
>
> > > > The output during db:migrate is:
> > > > setting item_id = 1 to active = true # (this one is before the save)
> > > > setting item_id = 1 to active = true # (this one is after the save)
> > > > setting item_id = 1 to active =      # (this one is after the lookup)
> > > > ...
>
> > > > During db:migrate:up, it works as expected:
> > > > setting item_id = 1 to active = true
> > > > setting item_id = 1 to active = true
> > > > setting item_id = 1 to active = true
> > > > ...
>
> > > > For some reason, the data appears to not be actually committed to the
> > > > database during db:migrate, while it is during db:migrate:up. There's
> > > > no exception thrown by save!, no indicator that I can see that the
> > > > save is unsuccessful. Even if it was, why would it only be
> > > > unsuccessful during a regular migration run, and not during
> > > > db:migrate:up?
>
> > > > Has anyone seen this before? Do you have any idea what could cause
> > > > this?
>
> > > > Thanks.

-- 
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-t...@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to