I have added a column to my table via a migration, but I am not able to access the added column in the subsequent migration file.
When I execute rake db:migrate the migration aborts, but when I execute it again the migration succeeds, not sure what I am doing wrong. Any help would be appreciated. Thanks.
below is the code where i am adding column
**
class AddIsDispatchToUsers < ActiveRecord::Migration
def change
add_column :users, :is_dispatch, :boolean, :default=>false
end
end
**
Now, when i try to access the column in next migration file it fails.
The subsequent migration file has the code below
service_member = Member.create(:is_dispatch=>true)
And Here is the error that it produces
unknown attribute: is_dispatch/Users//.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/base.rb:1764:in `block in assign_attributes'
/Users//.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/base.rb:1758:in `each'
/Users//.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/base.rb:1758:in `assign_attributes'
/Users//.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/base.rb:1578:in `initialize'
/Users//.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/base.rb:508:in `new'
/Users//.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/base.rb:508:in `create'
/Users//Desktop/RailsDevelopement//db/migrate/20161003121452_add_dispatch_services.rb:11:in `up'
Have you tried User.reset_column_information after add_column in same migration.
Related
I’m using Rails 4.2.7 and PostGres 9.5. I’m trying to create a trqm index on my table (to facilitate LIKE searches) so I created this migration
class AddTrqmIndexOnRaceTimes < ActiveRecord::Migration
def change
CREATE INDEX my_object_times_name_gin_trgm_idx ON my_object_times USING gin (name gin_trgm_ops);
end
end
This results in the below error when I run “rake db:migrate” …
StandardError: An error has occurred, this and all later migrations canceled:
undefined local variable or method `gin_trgm_ops' for #<AddTrqmIndexOnRaceTimes:0x007fdc34b40600>
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:664:in `block in method_missing'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:634:in `block in say_with_time'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:634:in `say_with_time'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:654:in `method_missing'
/Users/mikeb/Documents/workspace/runtrax/db/migrate/20161012185951_add_trqm_index_on_my_object_times.rb:3:in `change'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:608:in `exec_migration'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:592:in `block (2 levels) in migrate'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:591:in `block in migrate'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:292:in `with_connection'
/Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/migration.rb:590:in `migrate'
What’s the right way to create this index in a Rails migration?
You cannot add SQL directly in the ruby method change. Either use the add_index method, or if you need to go beyond the capabilities of the helper, use ActiveRecord to execute your query like this:
class AddTrqmIndexOnRaceTimes < ActiveRecord::Migration
def change
MyObjectTime.connection.execute("CREATE INDEX my_object_times_name_gin_trgm_idx ON my_object_times USING gin (name gin_trgm_ops);")
end
end
Rails 5 adds support for specifying operator classes on expression indexes
for example:
def change
add_index :patients, 'lower(last_name) varchar_pattern_ops', name: "index_patients_on_name_unique", unique: true
end
source
ou need to make slight changes to your code. Wrap the sql query in execute.
class AddTrqmIndexOnRaceTimes < ActiveRecord::Migration
def change
execute "CREATE INDEX my_object_times_name_gin_trgm_idx ON my_object_times USING gin (name gin_trgm_ops);"
end
end
this is the first time I try to write a ruby migration script (I want to update the value of a col for a specific row).
I have a table called "events" with cols "e_id" and "e_text_en". I want to update the "e_text_en" value of the row with ID 6.
In SQL it would be
update events set e_text_en = 'blabla' where e_id = 6;
My ruby approach: (20141013130000_update_broken_event_texts.rb)
class UpdateBrokenTextsEventInEvent < ActiveRecord::Migration
def Events.up
Events.where('e_id', 6).update_all(e_text_en: "blablabla")
end
end
But this gives me the error ´NameError: uninitialized constant´
rake aborted!
NameError: uninitialized constant UpdateBrokenTextsEventInEvent::Events
/var/.../20141013130000_update_broken_event_texts.rb:2:in `<class:UpdateBrokenTextsEventInEvent>'
/var/.../20141013130000_update_broken_event_texts.rb:1:in `<top (required)>'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/migration.rb:718:in `load_migration'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/migration.rb:714:in `migration'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/migration.rb:708:in `disable_ddl_transaction'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/migration.rb:1012:in `use_transaction?'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/migration.rb:922:in `rescue in block in migrate'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/migration.rb:919:in `block in migrate'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/migration.rb:916:in `each'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/migration.rb:916:in `migrate'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/migration.rb:764:in `up'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/migration.rb:742:in `migrate'
/var/lib/gems/1.9.1/gems/activerecord-4.0.1/lib/active_record/railties/databases.rake:42:in `block (2 levels) in <top (required)>'
Tasks: TOP => db:migrate
While I searched for a solution I found some advises that tables are called in singular, but even when I try Event instead of Events I get the same error.
Can anyone help me to correct my ruby?
Versions used:
$ rails -v
Rails 4.0.1
$ gem -v
1.8.23.2
$ ruby -v
ruby 1.9.3p545 (2014-02-24) [i686-linux] Brightbox
edit: Addional infos
Our Schema is created via sql-File. We started to use migrations a short time ago and this is the first update-one. The first two migrations where table-changes. We don't have any ´app/model´ files yet, becuase the other migrations worked without any, e.g.:
class AddDeliveriesToEmailQueue < ActiveRecord::Migration
def change
add_column :email_queue, :deliveries, :int, :null => false, :default => 0, :after => :error
end
end
Firstly your migration class name must match the file name (rails will load the migration file and then assume it created a class of the corresponding name). Assuming you don't change your file name, it means that you need to have
class UpdateBrokenEventTexts < ActiveRecord::Migration
...
end
Since you say that you have no model classes, you'll have to use raw SQL, for example
class UpdateBrokenEventTexts < ActiveRecord::Migration
def change
execute "UPDATE events SET e_text_en = 'blablabla'"
end
end
This is pretty much the same as using ActiveRecord::Base.connection.execute but saves a little on the typing and makes sure Rails understands you're making an irreversible change.
This is a common problem when you create migration and then deside to rename it. Class name in migration should be the same as the filename. You have migration with class UpdateBrokenTextsEventInEvent and filename 20141013130000_update_broken_event_texts.rb, but the class name should be UpdateBrokenEventTexts.
Create Event model:
$ rails g model Event
Assuming that you have a model class Event(inside app/models/event.rb) now, then change these lines:
class UpdateBrokenTextsEventInEvent < ActiveRecord::Migration
def Events.up
Events.where('e_id', 6).update_all(e_text_en: "blablabla")
end
end
to:
class UpdateBrokenTextsEventInEvent < ActiveRecord::Migration
def self.up
Event.where('e_id', 6).update_all(e_text_en: "blablabla")
end
end
Also, I'd recommend you to move such operations in a rake tasks instead of moving them in a migration file:
namespace :events do
desc "Update e_text_en field with blablabla"
task :update_e_text_en => :environment do
Event.where('e_id', 6).update_all(e_text_en: "blablabla")
end
end
and then from your terminal:
$ rake events:update_e_text_en
UPDATE: Don't plan to have a model class for now? No worries, you can still update the column but with a SQL query:
class UpdateBrokenTextsEventInEvent < ActiveRecord::Migration
def self.up
ActiveRecord::Base.connection.execute("UPDATE events SET e_text_en = 'blablabla'")
end
end
Please note that these actions are irreversible(since you don't know what was the previous data in the column you're updating) and that's why they shouldn't be in a migration file. You probably be better with a rake task or something for such operations.
Im trying to use this migration but i keep getting the error, like these
This is my Migration file
class CreateEmployees < ActiveRecord::Migration
def self.up
create_table :employees do |t|
t.string :name
t.date :hiredate
t.float :salary
t.boolean :fulltime , :default => true
t.integer :vacationdays
t.text :comments
end
end
def self.down
drop_table :employees
end
end
when i try to execute rake db:migrate get this error:
== CreateEmployees: migrating ================================================
-- create_table(:employees) rake aborted! An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: table "employees" already exists: CREATE TABLE
"employees" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name"
varchar (255), "hiredate" date, "salary" float, "fulltime" boolean
DEFAULT 't', "vacationdays" integer, "comments" text)
/Library/Ruby/Gems/2.0.0/gems/sql
ite3-1.3.8/lib/sqlite3/database.rb:91:in initialize'
/Library/Ruby/Gems/2.0.0/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:91:in
new'
/Library/Ruby/Gems/2.0.0/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:91:in
prepare'
/Library/Ruby/Gems/2.0.0/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:134:in
execute'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:328:in block in execute'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:425:inblock in log'
/Library/Ruby/Gems/2.0.0/gems/activesupport-4.0.0/lib/active_support/notifications/instrumenter.rb:20:in
instrument'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:420:inlog'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:328:in execute'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/schema_statements.rb:190:in
create_table'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:625:in
block in method_missing'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:597:in
block in say_with_time'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:597:in
say_with_time'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:617:in
method_missing'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:383:in
method_missing' /Users/YuriAguirre/Documents/Aptana Studio 3
Workspace/company/db/migrate/20130923140626_create_employees.rb:3:in
up'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:534:in
up'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:574:in
exec_migration'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:555:in
block (2 levels) in migrate'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:554:in
block in migrate'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:294:in
with_connection'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:553:in
migrate'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:709:in
migrate'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:959:in
block in execute_migration_in_transaction'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:1005:in
block in ddl_transaction'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in
block in transactio n'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:210:in
within_new_transact ion'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in
transaction'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/transactions.rb:209:in transaction'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:1005:in
ddl_transaction'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:958:in
execute_migration_in_transaction'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:920:in
block in migrate'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:916:in
each'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:916:in
migrate'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:764:in
up'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:742:in
migrate'
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/railties/databases.rake:42:in
`block (2 levels) in ' Tasks: TOP => db:migrate (See
full trace by running task with --trace)
Your employees tables is already created in your database. You need to fix it then you can do it in two ways 1. drop the database and create one more or 2. run the down migration then up migration
rake db:drop
rake db:create
rake db:migrate
As I've written in comment, you are receiving that error because of:
SQLite3::SQLException: table "employees" already exists
Which simply means you already have that column in your database. You can resolve that in few ways:
changing migration to modify instead of create:
class CreateEmployees < ActiveRecord::Migration
def self.up
add_column :employees, :name, :string
(...)
end
end
def self.down
remove_column :employees, :name
end
end
add another migration which will drop whole table (obviously, that one should be with earlier timestamp than modifying one so table will be dropped first and then created again):
class RemoveEmployees < ActiveRecord::Migration
def change
drop_table :employees
end
end
drop table by hand from console, but that's not a very good option as you should learn to use migrations for altering your database, of course that w'd be the fastest one (if you know how to use console) and will make no harm if that's just some learning project, but still, you should learn good habits when you can.
You might also want to use newer syntax (AFAIK) def change instead of self.up and self.down, less letters to type and less duplication ;)
Your migration is not completely run.You should rollback migration and migrate again.
rails db:rollback
rails db:migrate
You ran that migration already with an error in it. So the migration ran halfway, creating the table incompletely. Rollback that migration, and then run the migration again.
I am using rails 2.x version. Am using mysql 5.0 database for back end process. I faced a migration error when i did the following steps.
Get the application code from github.
Run schema:create, load and seed process
After that add some data in the application.
Again Pull the code from the same branch.
After that i run db:migrate it throws the following error
-> rake db:migrate --trace
DEPRECATION WARNING: Rake tasks in vendor/plugins/acts_as_audited/tasks,
vendor/plugins/annotate_models/tasks,
vendor/plugins/app_version/tasks, vendor/plugins/bullet/tasks,
vendor/plugins/importer/tasks, vendor/plugins/mimetype-fu/tasks,
vendor/plugins/railsdav/tasks, vendor/plugins/rav/tasks,
vendor/plugins/simple_captcha/tasks, vendor/plugins/smart_table/tasks,
vendor/plugins/test_data_generator/tasks,
vendor/plugins/visualize_models/tasks, and
vendor/plugins/xss_terminate/tasks are deprecated. Use lib/tasks
instead. (called from
/usr/lib/ruby/gems/1.8/gems/rails-2.3.12/lib/tasks/rails.rb:10)
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environmentThu 11 Jul 2013 09:24:36 AM IST
** Execute db:migrate
== ConvertOrganizationToAwesomeNestedSet: migrating ==========================
Running sample patched rebuild process.
rake aborted!
An error has occurred, all later migrations canceled:
Validation failed: Name can't be blank
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/validations.rb:1102:in
save_without_dirty!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/dirty.rb:87:in
save_without_transactions!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/transactions.rb:200:in
save!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in
transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/transactions.rb:182:in
transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/transactions.rb:200:in
save!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/transactions.rb:208:in
rollback_active_record_state!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/transactions.rb:200:in
save!'
/opt/sample/lib/awesome_nested_set_overrides.rb:25:in rebuild!'
/opt/sample/lib/awesome_nested_set_overrides.rb:22:incall'
/opt/sample/lib/awesome_nested_set_overrides.rb:22:in rebuild!'
/opt/ssample/lib/awesome_nested_set_overrides.rb:22:ineach'
/opt/sample/lib/awesome_nested_set_overrides.rb:22:in rebuild!'
/opt/sample/lib/awesome_nested_set_overrides.rb:32:incall'
/opt/sample/lib/awesome_nested_set_overrides.rb:32:in rebuild!'
/opt/sample/lib/awesome_nested_set_overrides.rb:29:ineach'
/opt/sample/lib/awesome_nested_set_overrides.rb:29:in rebuild!'
./db/migrate//20130102220216_convert_organization_to_awesome_nested_set.rb:6:in
up_without_benchmarks'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:282:in
send'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:282:in
migrate'
/usr/lib/ruby/1.8/benchmark.rb:293:in measure'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:282:in
migrate'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:365:in
__send__'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:365:in
migrate'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:491:in
migrate'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:567:in
call'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:567:in
ddl_transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:490:in
migrate'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:477:in
each'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:477:in
migrate'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:401:in
up'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.12/lib/active_record/migration.rb:383:in
migrate'
/usr/lib/ruby/gems/1.8/gems/rails-2.3.12/lib/tasks/databases.rake:112
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/task.rb:228:in call'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/task.rb:228:inexecute'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/task.rb:223:in each'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/task.rb:223:inexecute'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/task.rb:166:in invoke_with_call_chain'
/usr/lib/ruby/1.8/monitor.rb:242:insynchronize'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/task.rb:159:in invoke_with_call_chain'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/task.rb:152:ininvoke'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/application.rb:143:in
invoke_task'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/application.rb:101:in
top_level'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/application.rb:101:in
each'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/application.rb:101:in
top_level'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/application.rb:110:in
run_with_threads'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/application.rb:95:in
top_level'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/application.rb:73:in
run'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/application.rb:160:in
standard_exception_handling'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/lib/rake/application.rb:70:in
run'
/usr/lib/ruby/gems/1.8/gems/rake-10.0.3/bin/rake:33
/usr/bin/rake:19:inload'
/usr/bin/rake:19
Tasks: TOP => db:migrate
Organization.rebuild! - This is the code that calls the plugin.
It seems like there is some problem with awesome_nested_set plugin. I am struggle with this for past one week. Any comments would be appreciated.
EDIT - 1
class ConvertOrganizationToAwesomeNestedSet < ActiveRecord::Migration
def self.up
# add_column :party, :lft, :integer
# add_column :party, :rgt, :integer
Organization.reset_column_information
Organization.rebuild!
end
def self.down
remove_column :party, :lft
remove_column :party, :rgt
end
end
Model - Organization
class Organization < Party
attr_accessible :name,
:parent_id
default_scope :order => 'name'
acts_as_nested_set has_many :children, :class_name => 'Organization',
:foreign_key => "parent_id"
belongs_to :parent, :class_name =>'Organization', :foreign_key => "parent_id"
def display_name
name
end
You are using ActiveRecord model class in your migration. In short: don't.
This is likely to cause problems in the long run. If you have a migration that uses a model class, and than run it again later on, you'll be in trouble if anyone changes that model class.
Migrations are strictly for setting up the database, and should be constructed so that they will always behave in the same way - regardless of what the current state of your app's code is.
If you really need a migration to an ActiveRecord model: Define that class inside the migration file. This way it will be immutable to changes to the rest of the app.
Since you're getting
Validation failed: Name can't be blank
you must have a
validates_presence_of :name
somewhere, either on your class or in the plugin.
Maybe you have some invalid records in your database, and when you rebuild!, they are saved (and validated) and you get this error.
I have the following migration:
def self.up
add_column :project_statuses, :system_sequence, :integer, :default => 0, :null => false
ProjectStatus.create :name => 'Declined', :sequence => 35, :system_sequence => 110
...
end
But when I do a rake db:create, rake db:migrate, I get the following error:
== NewProjectStatuses: migrating =============================================
-- add_column(:project_statuses, :system_sequence, :integer, {:default=>0, :null=>false})
-> 0.0029s
rake aborted!
An error has occurred, this and all later migrations canceled:
unknown attribute: system_sequence
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1753:in `block in assign_attributes'
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1747:in `each'
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1747:in `assign_attributes'
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1567:in `initialize'
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:508:in `new'
/Users/ttt/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/base.rb:508:in `create'
/[working dir]/db/migrate/20100816100139_new_project_statuses.rb:7:in `up'
The erroneous line number refers to the Project.create :name => ... line.
It seems like the add_column line isn't run at all, even though the output says it is run.
Running a rake db:migrate again runs through the migrations fine though.
Why is this?
Try calling ProjectStatus.reset_column_information after the add_column block.
Rails caches column information (including which columns exist), and I believe what you're hitting here is that you're creating a column, but that doesn't trigger Rails to reset its cache on the list of available columns. As a result, your following line fails, because it doesn't think the column exists.
I'm not sure why the caching is designed this way, but this sort of thing is explicitly mentioned in the example code regarding the use of reset_column_information. I think there's a pretty good chance that's the issue.
That being said, I also generally agree with Michael Durrant, regarding the use of filling the DB with values via migrations. The preferred method is to add your default/seed data to a rake task (which can be run at any arbitrary time), or your seeds.rb file. This is in contrast to a migration, which is only run when the current schema version is older than the specified migration.