2012-09-04 52 views
3

我有3個表和3種型號:ActiveRecord的破壞方法 - 錯誤的參數數目(0 1)

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負荷(0.9ms)SELECT 「cars_domains」 * FROM 「cars_domains」 WHERE 「cars_domains」 「car_id」= 2且 「cars_do 電源」, 「域ID」= 1 (0.2ms)SAVEPOINT active_record_1 無法記錄「sql.active_record」事件。 NoMethodError:未定義的方法`name'爲零:NilClass (0.2ms)ROLLBACK TO SAVEPOINT active_record_1 ActiveRecord :: StatementInvalid:PGError:ERROR:零長度定界標識符在或接近「」「」「 LINE 1:DELETE FROM」cars_domains 「WHERE 」cars_domains「= $ 1 ^ 「。」:DELETE FROM 「cars_domains」 WHERE 「cars_domains」 「」= $ 1

UPD 2

我覺得在ID這個問題---- CREATE_TABLE: cars_domains,:id => false。因爲Destroy方法需要它。

回答

2

問題出在: create_table:cars_domains,:id => false do | t |

正確的變體是: create_table:cars_domains do | t |

而且CarsDomain.where(:car_id => PARAMS [:car_id]:域ID => PARAMS [:域ID])。destroy_all

5

因爲您有更多的條目,它屬於CarsDomain。 CarsDomain#destroy需要一個id,所以這就是爲什麼你得到這個消息。有條件使用destory_all

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

+0

我用它。發佈更新 – user1466717

+0

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

3

在你的汽車模型(car.rb)你有相關的設置爲:delete_all,當它應該是:destroy,這意味着has_many :cars_domains, :dependent => :destroy

如果您的域名也取決於你需要添加:dependent => :destroy到你的域模型也是如此。

相關問題