3

3 つのテーブルと 3 つのモデルがあります。

カー.rb

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

ドメイン.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

1 台の車がいくつかのドメインに存在する場合があります。車を作成してドメインに関連付けると、すべてがうまくいきます。

しかし、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'

どうしたの?

更新:

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 mains"."domain_id" = 1 (0.2ms) SAVEPOINT active_record_1 は "sql.active_record を記録できませんでした" " イベント。NoMethodError: nil:NilClass (0.2ms) の未定義のメソッド `name' cars_domains"."" = $1 ^ : DELETE FROM "cars_domains" WHERE "cars_domains"."" = $1

更新 2

ID ---- create_table :cars_domains, :id => false に問題があると思います。Destroy メソッドがそれを必要とするためです。

4

4 に答える 4

5

より多くのエントリがあり、CarsDomain に属しているためです。CarsDomain#destroy は ID を想定しているため、このメッセージが表示されました。条件付きで使えdestory_allます!

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

于 2012-09-04T19:03:12.753 に答える
4

あなたはコレクションに取り組んでいるので、を使用してdestroy_allください。

ドキュメントを参照してください

于 2012-09-04T19:02:09.353 に答える
3

あなたの車のモデル (car.rb) では、従属セットが に設定されています:delete_all:destroyhas_many :cars_domains, :dependent => :destroy

ドメインも依存している場合は:dependent => :destroy、ドメイン モデルにも追加する必要があります。

于 2012-09-04T19:11:55.890 に答える
2

問題は次のとおりです: create_table :cars_domains, :id => false do |t|

正しいバリアントは次のとおりです。 create_table :cars_domains do |t|

CarsDomain.where(:car_id => params[:car_id], :domain_id => params[:domain_id]).destroy_all

于 2012-09-05T17:15:40.967 に答える