无法通过Rails的删除记录 [英] Can't delete record through Rails

查看:217
本文介绍了无法通过Rails的删除记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表,说的人,如果我这样做

 人= Person.find的(:先)
person.delete
 

我收到

  NoMethodError:未定义的方法`to_sym'的零:NilClass
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/的ActiveSupport-3.1.1 / lib中/ active_support / whiny_nil.rb:48:在`method_missing的'
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ ActiveRecord的-3.1.1 / lib中/ active_record / base.rb:1403:在`块expand_hash_conditions_for_aggregates
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ ActiveRecord的-3.1.1 / lib中/ active_record / base.rb:1402:在'各'
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ ActiveRecord的-3.1.1 / lib中/ active_record / base.rb:1402:在'expand_hash_conditions_for_aggregates
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/relation/query_methods.rb:261:in `build_where
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/relation/query_methods.rb:124:in `其中
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ ActiveRecord的-3.1.1 / lib中/ active_record / relation.rb:380:在'删除'
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ ActiveRecord的-3.1.1 / lib中/ active_record / base.rb:442:在'删除'
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ ActiveRecord的-3.1.1 / lib中/ active_record / persistence.rb:72:在'删除'
        从(IRB):60
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ railties-3.1.1 / lib中/导轨/命令/ console.rb:45:在'开始'
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ railties-3.1.1 / lib中/导轨/命令/ console.rb:8:'开始'
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ railties-3.1.1 / lib中/导轨/ commands.rb:40:在`<顶(必填)>
        从脚本/导轨:6:在'要求'
        从脚本/导轨:6:`<主>
 

如果我这样做

  person.destroy
 

我收到

  SQL(为0.2ms)BEGIN
无法登录sql.active_record事件。 NoMethodError:对于无未定义的方法'名':NilClass
MySQL的::错误:未知列'的人。在where子句:DELETE FROM`persons` WHERE`persons`.`` =?
   (0.1毫秒)ROLLBACK
ActiveRecord的:: StatementInvalid:Mysql的::错误:'人'未知列在where子句:DELETE FROM`persons` WHERE`persons`.`` =?
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:883:in `prepare
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:883:in `exec_stmt
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:490:in `块exec_delete
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract_adapter.rb:244:in `块日志
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activesupport-3.1.1/lib/active_support/notifications/instrumenter.rb:21:in `仪器
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract_adapter.rb:239:in '登录'
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:489:in `exec_delete
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:101:in '删除'
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/query_cache.rb:14:in '删除'
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ ActiveRecord的-3.1.1 / lib中/ active_record / relation.rb:351:在'DELETE_ALL
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ ActiveRecord的-3.1.1 / lib中/ active_record / persistence.rb:94:在'灭'
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/locking/optimistic.rb:119:in `破坏'
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ ActiveRecord的-3.1.1 / lib中/ active_record / callbacks.rb:254:在'块消灭
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activesupport-3.1.1/lib/active_support/callbacks.rb:390:in `_run_destroy_callbacks
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/的ActiveSupport-3.1.1 / lib中/ active_support / callbacks.rb:81:在'run_callbacks
        从.rvm /宝石/红宝石-1.9.2-P320 @轨-3.1.1 /宝石/ ActiveRecord的-3.1.1 / lib中/ active_record / callbacks.rb:254:在'灭'
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/transactions.rb:236:in `块破坏
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/transactions.rb:295:in `块with_transaction_returning_status
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in '交易'
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/transactions.rb:208:in '交易'
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/transactions.rb:293:in `with_transaction_returning_status
        从.rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/transactions.rb:236:in `破坏'
        从(IRB):61
 

不过,我可以删除通过MySQL的控制台记录,如果我写了一个SQL DELETE语句。任何想法可能发生的事?

其他信息: Person表有一个ID列,但在databae主键是使用id等一些列的组合键。此人模型,别人写的,而且有一些书面的方法,但没有命名删除或销毁被明确写入。

解决方案

  @person = Person.first
@ person.destroy
 

如果您使用了非标准的主键,您需要先设置:

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

如果一切都失败了......我觉得不好打字这样的:

  Person.connection.execute(人员删除其中id = 1和STATE_ID = 2和PROJECT_ID = 5)
 

要保存自己当前和未来的恶梦,你应该调整你的数据库来跟踪轨道存储数据的标准方法。 Person表应包含唯一的人,唯一ID列是主键。新project_assignments表/模式应该建立处理任务有它自己唯一的ID,以及STATE_ID,PROJECT_ID,并为person_id。与人属于应驻留在该表中的数据,分配数据应移至project_assignments等。

I have a table, say Persons and if I do

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

I get

NoMethodError: undefined method `to_sym' for nil:NilClass
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activesupport-3.1.1/lib/active_support/whiny_nil.rb:48:in `method_missing'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1403:in `block in expand_hash_conditions_for_aggregates'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1402:in `each'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/base.rb:1402:in `expand_hash_conditions_for_aggregates'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/relation/query_methods.rb:261:in `build_where'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/relation/query_methods.rb:124:in `where'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/relation.rb:380:in `delete'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/base.rb:442:in `delete'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/persistence.rb:72:in `delete'
        from (irb):60
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/railties-3.1.1/lib/rails/commands/console.rb:45:in `start'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/railties-3.1.1/lib/rails/commands/console.rb:8:in `start'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/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>'

If I do

person.destroy

I get

  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/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:883:in `prepare'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:883:in `exec_stmt'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:490:in `block in exec_delete'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract_adapter.rb:244:in `block in log'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activesupport-3.1.1/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract_adapter.rb:239:in `log'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/mysql_adapter.rb:489:in `exec_delete'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:101:in `delete'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/query_cache.rb:14:in `delete'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/relation.rb:351:in `delete_all'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/persistence.rb:94:in `destroy'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/locking/optimistic.rb:119:in `destroy'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/callbacks.rb:254:in `block in destroy'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activesupport-3.1.1/lib/active_support/callbacks.rb:390:in `_run_destroy_callbacks'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activesupport-3.1.1/lib/active_support/callbacks.rb:81:in `run_callbacks'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/callbacks.rb:254:in `destroy'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/transactions.rb:236:in `block in destroy'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/transactions.rb:208:in `transaction'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/transactions.rb:293:in `with_transaction_returning_status'
        from .rvm/gems/ruby-1.9.2-p320@rails-3.1.1/gems/activerecord-3.1.1/lib/active_record/transactions.rb:236:in `destroy'
        from (irb):61

But I can delete the record through MySQL console if I write a SQL delete statement. Any idea what might be happening?

Other information: The Person table has an id column, but the primary key in the databae is a composite key using the id and some other columns. The person model was written by someone else, and has a number of methods written, but none named delete or destroy were written explicitly.

解决方案

@person = Person.first
@person.destroy

If you used a non standard primary key, you will need to set it first:

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

If all else fails ... I feel bad for typing this:

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

To save yourself current and future nightmares, you should restructure your database to follow rails standard way of storing data. Person table should contain only unique people with unique id column that is a primary key. New project_assignments table/model should be created to handle assignments with it's own unique id, as well as state_id, project_id, and person_id. Data that belongs with Person should reside in that table, assignment data should be moved to project_assignments etc.

这篇关于无法通过Rails的删除记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆