0

賢い人、

has_manyポリモーフィックオブジェクト作成の問題のトラブルシューティングを手伝ってください。

中央に結合テーブルがある2つのオブジェクト間にポリモーフィックなhas_many関係があります。一方に頭字語(およびその他のオブジェクト)、もう一方にカテゴリ。それらの間に、2つのオブジェクトの間に結合オブジェクトがあります。

カテゴリで頭字語をうまく作成できません。ただし、カテゴリなしで頭字語を作成してから、既存の頭字語にカテゴリを追加することはできます。

私のモデルオブジェクトは次のコードのようになります。

class Acronym < ActiveRecord::Base
  has_many :category_belongings, :as => :categorizable, :dependent => :delete_all
  has_many :categories, :through => :category_belongings
end

class Category < ActiveRecord::Base
  has_many :category_belongings, :dependent => :delete_all
  has_many :acronyms, :through => :category_belongings, :source => :categorizable, :source_type => 'Acronym'
end

class CategoryBelonging < ActiveRecord::Base
  belongs_to :categorizable, :polymorphic => true
  belongs_to :category
end

参考までに、いくつかの余分なフィールドと無関係なルールを削除しました。また、コードをリファクタリングして、次の例のように しました。ポリモーフィックなhas_many:through関係の設定

Railsアプリケーション/Railsコンソールを介して、次のことができます。

  • カテゴリなしで頭字語を正常に作成する
  • カテゴリを正常に作成する
  • 頭字語を更新して、既存のカテゴリを既存の頭字語に正常に追加する

ただし、既存のカテゴリで新しい頭字語を作成することはできません。Railsが次のことを試みていることがログでわかります。

  1. 投稿からパラメータを収集します。これらのパラメーターには、頭字語テーブルの列とカテゴリーIDが含まれます。
  2. カテゴリが存在するかどうかを確認します。します。
  3. 頭字語が存在するかどうかを確認します。そうではありません。
  4. すべての列パラメーターを使用して、新しい頭字語をデータベースに挿入します
  5. 結合テーブルに新しいエントリを挿入しようとします。ここにエラーがあります。この挿入のSQLには、頭字語IDのNil値が含まれています。
  6. 変更をロールバックします。

    Processing by Admin::AcronymsController#create as HTML
      Parameters: {"utf8"=>"✓", "authenticity_token"=>"/uquz5FvtMh0QWP5NoWwTO9FMMEC9rsMTrTj4WUNxxE=", "acronym"=>{"name"=>"A Test Acronym", "definition"=>"A Test Definition", "explanation"=>"", "category_ids"=>["1", ""], "state"=>"unapproved"}, "commit"=>"Create Acronym"}
      Category Load (0.4ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = $1 LIMIT 1  [["id", 1]]
       (0.3ms)  BEGIN
      Category Exists (0.6ms)  SELECT 1 AS one FROM "categories" WHERE ("categories"."name" = 'Internet' AND "categories"."id" != 1) LIMIT 1
      Acronym Exists (26.0ms)  SELECT 1 AS one FROM "acronyms" WHERE "acronyms"."name" = 'A Test Acronym' LIMIT 1
      SQL (18.1ms)  INSERT INTO "acronyms" ("definition", "explanation", "improvement_reason", "likes_count", "name", "state", "submitter_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["definition", "A Test Definition"], ["explanation", ""], ["improvement_reason", nil], ["likes_count", 0], ["name", "A Test Acronym"], ["state", "unapproved"], ["submitter_id", nil]]
      SQL (55.8ms)  INSERT INTO "category_belongings" ("categorizable_id", "categorizable_type", "category_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["categorizable_id", nil], ["categorizable_type", "Acronym"], ["category_id", 1], ["created_at", Thu, 28 Feb 2013 23:03:48 UTC +00:00], ["updated_at", Thu, 28 Feb 2013 23:03:48 UTC +00:00]]
    PG::Error: ERROR:  null value in column "categorizable_id" violates not-null constraint
    : INSERT INTO "category_belongings" ("categorizable_id", "categorizable_type", "category_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"
       (0.3ms)  ROLLBACK
    

頭字語の挿入でacronym_idが作成されると想定しますが、そのacronym_idの値を示す出力は表示されません。私にとって、新しい行をcategory_belongingsに挿入しようとすると、頭字語がNilであるというエラーが明らかになります。どういうわけかacronym_idをcategorizable_idにポイントする必要がありますか?その場合、どうすればよいですか?

私はレールに不慣れで、既存のシステムを維持および改善しようとしています。助けてくれてありがとう。

4

2 に答える 2

1

あなたがやろうとしていることに基づいて、あなたはを使う必要がありますaccepts_nested_attributes_for。これにより、頭字語を作成するときにカテゴリを作成できます。設定方法は次のとおりです。

class Acronym < ActiveRecord::Base
  has_many :categories, :through => :category_belongings
  has_many :category_belongings, :dependent => :destroy
  accepts_nested_attributes_for :acronyms

  attr_accessible :acronyms_attributes      
end

class Category < ActiveRecord::Base
  has_many :acronyms, :through => :category_belongings
  has_many :category_belongings, :dependent => :destroy     
end

class CategoryBelonging < ActiveRecord::Base
  belongs_to :acronym
  belongs_to :category
end

この設定により、頭字語を作成するときにフォームをネストしてカテゴリを作成できます。すべてのオプションの詳細についてはaccepts_nested_attributes_forRailsAPIを確認してください。このRailscastには、ネストされたフォームに関するいくつかの優れた情報もあります。

于 2013-03-01T00:50:27.803 に答える
0

私のコードは大丈夫だったようです-Railsのバグに悩まされました。これらの手順に従ってセキュリティパッチを有効にして、Railsバージョンを3.2.8に移動することで問題を解決しました。その後、コードを変更することなく、すべてが正常に機能しました。

https://github.com/rails/rails/issues/8269#issuecomment-10518099

于 2013-03-05T15:08:25.330 に答える