Although everyone breaks this rule, it's generally bad practice to use model
references in your migration files, precisely because of the problem you're
now running into. Migrations are supposed to affect *schema*, and you don't
want schema cross-dependent on your models and the state of those models in
your source code. You want your migrations to always be idempotent given a
particular schema revision. So for example if you really want to update data
in a migration (leaving aside whether this is good practice or not - that's
a separate debate):

The wrong way:

Customer.update_all :field => 1

(A) right way:

ActiveRecord::Base.connection.execute("UPDATE customers SET field = 1")

Assuming you don't actually want to change the semantics of your migration
scripts, what I would probably do is modify the migration to not depend on
that model and instead directly operate on the schema. But then again
depending on what you're doing it might make more sense to extract this
stuff out as seed data or some other loader anyways, but that's hard to
judge without knowing the specific circumstances.

Another option instead of (3) is to define a stub ActiveRecord model
*within* your migration file, so it's in scope only for your migration. See
the example here:
http://ketan.padegaonkar.name/2010/11/20/using-models-in-rails-migrations.html

Ben


On Mon, Oct 17, 2011 at 10:08 AM, Brett Stewart
<[email protected]>wrote:

> I have a situation where I've renamed a table and removed a model after
> many migrations.  In prior migrations, the model is used to save default
> data to db. I have a new developer who want to run migrations for the
> first time, but now an error occurs because the model which sets the
> data has been removed from the source.
>
> The list of options I've thought of:
>
> 1) give SQL dump of db so he can start from current state
>
> 2) Remove migrations which set data and place into a script (and
> Capistrano recipe)
>
> 3) Add model back to source, and deprecate (starting to smell bad)
>     Question: What is the best method for adding a deprecation warning
> on an entire model and not just it's methods?
>
>     I'm tempted to use the following
>     ----
>
>    require 'active_support/deprecation'
>
>     class B<  ActiveRecord::Base
>         def initialize(attributes = nil)
>            self
>         end
>         deprecate :initialize
>     end
>     ----
>
>     This probably won't work because of addition of validations after
> future migrations
>
> 4) modify migrations (smells really bad)
>     The system has not been put into production yet, but this is not a
> maintainable solution.
>
>
> Thanks in advance for help,
>
> Brett
>
> --
> SD Ruby mailing list
> [email protected]
> http://groups.google.com/**group/sdruby<http://groups.google.com/group/sdruby>
>

-- 
SD Ruby mailing list
[email protected]
http://groups.google.com/group/sdruby

Reply via email to