2012-10-05 20 views
0

刪除記錄我有一個表,說的人,如果我做無法通過Rails的

person = Person.find(:first) 
person.delete 

我得到

NoMethodError: undefined method `to_sym' for nil:NilClass 
     from .rvm/gems/[email protected]/gems/activesupport-3.1.1/lib/active_support/whiny_nil.rb:48:in `method_missing' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/base.rb:1403:in `block in expand_hash_conditions_for_aggregates' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/base.rb:1402:in `each' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/base.rb:1402:in `expand_hash_conditions_for_aggregates' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/relation/query_methods.rb:261:in `build_where' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/relation/query_methods.rb:124:in `where' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/relation.rb:380:in `delete' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/base.rb:442:in `delete' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/persistence.rb:72:in `delete' 
     from (irb):60 
     from .rvm/gems/[email protected]/gems/railties-3.1.1/lib/rails/commands/console.rb:45:in `start' 
     from .rvm/gems/[email protected]/gems/railties-3.1.1/lib/rails/commands/console.rb:8:in `start' 
     from .rvm/gems/[email protected]/gems/railties-3.1.1/lib/rails/commands.rb:40:in `<top (required)>' 
     from script/rails:6:in `require' 
     from script/rails:6:in `<main>' 

如果我做

person.destroy 

我得到

SQL (0.2ms) BEGIN 
Could not log "sql.active_record" event. NoMethodError: undefined method `name' for nil:NilClass 
Mysql::Error: Unknown column 'persons.' in 'where clause': DELETE FROM `persons` WHERE `persons`.`` = ? 
    (0.1ms) ROLLBACK 
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'persons.' in 'where clause': DELETE FROM `persons` WHERE `persons`.`` = ? 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:883:in `prepare' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:883:in `exec_stmt' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:490:in `block in exec_delete' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract_adapter.rb:244:in `block in log' 
     from .rvm/gems/[email protected]/gems/activesupport-3.1.1/lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract_adapter.rb:239:in `log' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:489:in `exec_delete' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:101:in `delete' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/query_cache.rb:14:in `delete' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/relation.rb:351:in `delete_all' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/persistence.rb:94:in `destroy' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/locking/optimistic.rb:119:in `destroy' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/callbacks.rb:254:in `block in destroy' 
     from .rvm/gems/[email protected]/gems/activesupport-3.1.1/lib/active_support/callbacks.rb:390:in `_run_destroy_callbacks' 
     from .rvm/gems/[email protected]/gems/activesupport-3.1.1/lib/active_support/callbacks.rb:81:in `run_callbacks' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/callbacks.rb:254:in `destroy' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/transactions.rb:236:in `block in destroy' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/transactions.rb:208:in `transaction' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/transactions.rb:293:in `with_transaction_returning_status' 
     from .rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/transactions.rb:236:in `destroy' 
     from (irb):61 

但是,如果我編寫SQL刪除語句,我可以通過MySQL控制檯刪除記錄。任何想法可能發生什麼?

其他信息: Person表具有id列,但在databae主鍵是使用id和其他一些列的組合鍵。人員模型是由其他人編寫的,並且有許多方法編寫,但沒有一個名爲delete或destroy是明確寫的。

+0

在'persons'表中是否有'id'列?我們也可以看到'人'模型嗎? –

+0

@AnonyAlberto,我在問題中更新了一些。還有哪些信息可以幫助? – highBandWidth

回答

2
@person = Person.first 
@person.destroy 

如果您使用了非標準的主鍵,您需要先進行設定:

Person.primary_key = 'person_id' 
@person = Person.first 
@person.destroy 

如果一切都失敗了......我心疼打字:

Person.connection.execute("delete from persons where id = 1 and state_id = 2 and project_id = 5") 

爲了節省您當前和未來的噩夢,您應該重新構建數據庫以遵循標準存儲數據的方式。 Person表應該只包含具有唯一id列的唯一人員,這是唯一的主鍵。應創建新的project_assignments表/模型,以處理具有其自己唯一標識的分配,以及state_id,project_id和person_id。屬於Person的數據應該駐留在該表中,分配數據應該移至project_assignments等。

+0

它有一個複合主鍵。在這種情況下刪除記錄最簡單的方法是什麼? – highBandWidth

+0

您沒有一個唯一標識人員記錄的列嗎?爲什麼?什麼是組合鍵的列? – iouri

+0

我是解釋,但像(id,state_id,project_id)是主鍵。 – highBandWidth