2013-08-27 110 views
0

此遷移在初始開發人員計算機上運行良好,但在第二個開發環境中失敗。據我們所知,設置是相同的。Rails:rake db:遷移失敗`verify_readonly_attribute`

遷移:

class AddInventoryItemsCountToProduct < ActiveRecord::Migration 
    def change 
    add_column :products, :inventory_items_count, :integer, default: 0 

    reversible do |dir| 
     dir.up do 
     Product.all.each do |p| 
      p.update_attribute :inventory_items_count, p.inventory_items.length 
     end 
     end 
    end  
    end 
end 

沒見過這個錯誤。任何人都知道發生了什麼事?

$ rake db:migrate 
== AddInventoryItemsCountToProduct: migrating ================================ 
-- add_column(:products, :inventory_items_count, :integer, {:default=>0}) 
    -> 0.0112s 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

inventory_items_count is marked as readonly/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/persistence.rb:506:in `verify_readonly_attribute' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/persistence.rb:217:in `update_attribute' 
/Users/meltemi/rails/input/myapp/db/migrate/20130823022914_add_inventory_items_count_to_product.rb:8:in `block (3 levels) in change' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/relation/delegation.rb:13:in `each' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/relation/delegation.rb:13:in `each' 
/Users/meltemi/rails/input/myapp/db/migrate/20130823022914_add_inventory_items_count_to_product.rb:7:in `block (2 levels) in change' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:474:in `up' 
/Users/meltemi/rails/input/myapp/db/migrate/20130823022914_add_inventory_items_count_to_product.rb:6:in `block in change' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:510:in `block in reversible' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:687:in `execute_block' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:510:in `reversible' 
/Users/meltemi/rails/input/myapp/db/migrate/20130823022914_add_inventory_items_count_to_product.rb:5:in `change' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:571:in `exec_migration' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:555:in `block (2 levels) in migrate' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:554:in `block in migrate' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:294:in `with_connection' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:553:in `migrate' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:709:in `migrate' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:959:in `block in execute_migration_in_transaction' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:1005:in `block in ddl_transaction' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in `block in transaction' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:210:in `within_new_transaction' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in `transaction' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/transactions.rb:209:in `transaction' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:1005:in `ddl_transaction' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:958:in `execute_migration_in_transaction' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:920:in `block in migrate' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:916:in `each' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:916:in `migrate' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:764:in `up' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/migration.rb:742:in `migrate' 
/Users/meltemi/.rvm/gems/[email protected]/gems/activerecord-4.0.0/lib/active_record/railties/databases.rake:42:in `block (2 levels) in <top (required)>' 
/Users/meltemi/.rvm/gems/[email protected]/bin/ruby_noexec_wrapper:14:in `eval' 
/Users/meltemi/.rvm/gems/[email protected]/bin/ruby_noexec_wrapper:14:in `<main>' 
Tasks: TOP => db:migrate 
(See full trace by running task with --trace) 

回答

1

檢查這個答案:Problem with counter_cache implementation 你也可能採取第二個忠告:find_each,而不是每個

+0

這種聯繫使我對我的回答。在我的模型上設置了'counter_cache:true'使屬性'attr_readonly',以便我的遷移中的'update_attribute'不能更新記錄。我手動覆蓋它,但有興趣找到一種方法來覆蓋'attr_readonly'在未來的遷移期間。 – Meltemi