11

JobモデルとCategory、HABTMアソシエーションを使用して参加したモデルがあります。

Categories_Jobsモデルに割り当てようとするとエラーが発生します。

PG::Error: ERROR: null value in column "created_at" violates not-null constraint

j = Job.first
Job Load (0.7ms)  SELECT "jobs".* FROM "jobs" LIMIT 1
=> #<Job id: 7, user_id ...(removed rest of details for sake of clarity)

j.categories
Category Load (0.8ms)  SELECT "categories".* FROM "categories" INNER JOIN "categories_jobs" ON "categories"."id" = "categories_jobs"."category_id" WHERE "categories_jobs"."job_id" = 7
=> [] 

j.category_ids = [1]
Category Load (6.1ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" =   $1 LIMIT 1  [["id", 1]]
(0.2ms)  BEGIN
(0.6ms)  INSERT INTO "categories_jobs" ("job_id", "category_id") VALUES (7, 1)
(0.1ms)  ROLLBACK
ActiveRecord::StatementInvalid: PG::Error: ERROR:  null value in column "created_at" violates not-null constraint

Categories_Jobsモデルからタイムスタンプを削除する必要がありますか?

class CreateCategoriesJobs < ActiveRecord::Migration
  def change
    create_table :categories_jobs, :id => false do |t|
      t.integer :category_id
      t.integer :job_id
      t.timestamps
    end
  end
end

私はこれを別の方法で行うべきですか?

4

4 に答える 4

8

ソリューションについては、以下のリンクを参照してください。

HABTM

あなたのソリューション

削除t.timestampsしてから実行します。

class CreateCategoriesJobs < ActiveRecord::Migration
  def change
    create_table :categories_jobs, :id => false do |t|
      t.integer :category_id
      t.integer :job_id
    end
  end
end
于 2012-10-19T06:20:43.673 に答える
6

別の種類の多対多関係宣言を使用するだけです。

class Category ...

  has_many :categories_jobs
  has_many :categories, through: :categories_jobs

  ...
end

class Job ...

  has_many :categories_jobs
  has_many :jobs, through: :categories_jobs

  ...
end

その後、タイムスタンプを使用できるようになります。

于 2012-12-26T09:13:12.087 に答える
0

私の答えはOPの質問に正確に答えるものではありませんが、エラーメッセージをグーグルで検索するとこの投稿が表示されるので、とにかく答えています。

私はhas_many関係を持っています。ParentモデルとParentを使用しているとしましょうhas_many :child_models

電話すると

@parent.child_models.create(params)

その後、Postgresはnull値について文句を言います。しかし、私がそれを分割した場合、すべてがうまくいきます:

@child = @parent_object.child_models.build
@child.save

別の解決策は、NOT NULL制約を取り除くことでした。その場合create、エラーなしで戻り、後でレコードを見るとタイムスタンプが設定されます。ActiveRecordは、最初はタイムスタンプなしでレコードを保存してから、戻って挿入する必要があります。(Rails 4.2.5)

于 2016-04-12T21:21:55.897 に答える
0

それが他の誰かを助ける場合に備えて、子モデルでオブジェクトを保存するときにこのエラーメッセージに遭遇しました。子モデルを調べると、親モデルにIDがない場合でも、親IDが入力されていることがわかりました。ロギングをオンにしたところ、after_createブロックのエラーが原因で、親モデルがロールバックされていることがわかりました。

于 2019-12-24T15:30:08.280 に答える