ActiveRecord destroy方法 - 参数个数错误(0表示1)

时间:2012-09-04 18:55:12

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有3张桌子和3个型号:

Car.rb

  has_many :cars_domains, :dependent => :delete_all
  has_many :domains, :through => :cars_domains

Domain.rb

has_many :cars_domains
has_many :cars, :through => :cars_domains

和cars_domain.rb

class CarsDomain < ActiveRecord::Base
  belongs_to :car
  belongs_to :domain

  attr_accessible :car_id, :domain_id
end

class CreateCarsDomains < ActiveRecord::Migration
  def change
    create_table :cars_domains, :id => false do |t|
      t.references :car, :domain
      t.timestamps
    end

    add_index :cars_domains, [:car_id, :domain_id]
  end
end

一辆汽车可以在某些领域。 当我创建一辆汽车并绑定到一个域名时,一切都很好。

但是当我尝试从cars_domains表中删除时,我有错误:

CarsDomain.where(:car_id => 2, :domain_id => 1).destroy
ArgumentError: wrong number of arguments (0 for 1)

或者

 CarsDomain.where(:car_id => 2, :domain_id => 1).destroy_all

  CarsDomain Load (0.5ms)  SELECT "cars_domains".* FROM "cars_domains" WHERE "cars_domains"."car_id" = 2 AND "cars_do
mains"."domain_id" = 1

   (0.2ms)  SAVEPOINT active_record_1
Could not log "sql.active_record" event. NoMethodError: undefined method `name' for nil:NilClass
   (0.3ms)  ROLLBACK TO SAVEPOINT active_record_1
ActiveRecord::StatementInvalid: PGError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: DELETE FROM "cars_domains" WHERE "cars_domains"."" = $1
                                                        ^
: DELETE FROM "cars_domains" WHERE "cars_domains"."" = $1
        from /usr/local/lib/ruby/gems/1.9.1/gems/activerecord-3.1.3/lib/active_record/connection_adapters/postgresql_
adapter.rb:1062:in `prepare'

怎么了?

UPD:

CarsDomain.destroy_all(:car_id => 2, :domain_id => 1)

CarsDomain Load(0.9ms)SELECT“cars_domains”。* FROM“cars_domains”WHERE“cars_domains”。“car_id”= 2 AND“cars_do 主电源“。”domain_id“= 1    (0.2ms)SAVEPOINT active_record_1 无法记录“sql.active_record”事件。 NoMethodError:nil的未定义方法`name':NilClass    (0.2ms)ROLLBACK TO SAVEPOINT active_record_1 ActiveRecord :: StatementInvalid:PGError:ERROR:在“”“或附近的零长度分隔标识符 第1行:删除“cars_domains”WHERE“cars_domains”。“”= $ 1                                                         ^ :DELETE FROM“cars_domains”WHERE“cars_domains”。“”= $ 1

UPD 2

我认为ID中的问题---- create_table:cars_domains,:id =&gt;假。因为Destroy方法需要它。

4 个答案:

答案 0 :(得分:5)

因为您有更多条目,并且它属于CarsDomain。 CarsDomain#destroy需要一个id,这就是你得到这条消息的原因。使用destory_all条件!

CarsDomain.destroy_all(:car_id => 2, :domain_id => 1)

答案 1 :(得分:4)

您正在处理集合,因此请使用destroy_all

See doc

答案 2 :(得分:3)

在您的Car模型(car.rb)中,您的从属设置为:delete_all,应该为:destroy,表示has_many :cars_domains, :dependent => :destroy

如果您的域名也是相关的,则还需要将:dependent => :destroy添加到您的域名模型中。

答案 3 :(得分:2)

问题在于:     create_table:cars_domains,:id =&gt; false do | t |

正确的变体是:      create_table:cars_domains do | t |

和CarsDomain.where(:car_id =&gt; params [:car_id],:domain_id =&gt; params [:domain_id])。destroy_all