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