賢い人、
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が次のことを試みていることがログでわかります。
- 投稿からパラメータを収集します。これらのパラメーターには、頭字語テーブルの列とカテゴリーIDが含まれます。
- カテゴリが存在するかどうかを確認します。します。
- 頭字語が存在するかどうかを確認します。そうではありません。
- すべての列パラメーターを使用して、新しい頭字語をデータベースに挿入します
- 結合テーブルに新しいエントリを挿入しようとします。ここにエラーがあります。この挿入のSQLには、頭字語IDのNil値が含まれています。
変更をロールバックします。
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にポイントする必要がありますか?その場合、どうすればよいですか?
私はレールに不慣れで、既存のシステムを維持および改善しようとしています。助けてくれてありがとう。