2012-10-19 4 views
9

Ich habe ein Job Modell und ein Category Modell, das ich mit einer HABTM Association beigetreten bin.PG :: Fehler: Fehler: Null-Wert in der Spalte "created_at" beim Einfügen von Datensätzen in das zugehörige Modell

Ich erhalte einen Fehler beim Versuch, Categories_Jobs Modell zuzuweisen.

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 

Sollte entferne ich die Zeitstempel von meinem Categories_Jobs Modell?

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 

Sollte ich das anders machen?

Antwort

7

siehe unten Link für Ihre Lösung.

HABTM

Ihre Lösung

t.timestamps entfernen, und dann laufen.

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 
+1

Warum müssen wir t.timestamps nicht verwenden? – albertopriore

+0

es ist Beziehungstabelle für HABTM, so dass wir hier nicht Zeitstempel verwenden können. Wenn Sie den Zeitstempel verwenden möchten, verwenden Sie has_many: though relationship –

6

Verwenden Sie einfach eine andere Art von Viele-zu-Viele-Beziehungserklärung.

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 

dann können Sie Zeitstempel verwenden.

0

Meine Antwort beantwortet nicht genau die Frage des OP, aber dieser Beitrag kommt beim googlen der Fehlermeldung auf, so antworte ich trotzdem.

Ich habe eine has_many Beziehung. Nehmen wir an, wir verwenden ein Parent Modell und Eltern has_many :child_models.

Als ich

@parent.child_models.create(params) 

rufen dann klagt Postgres über Nullwerte. Aber wenn ich es aufgeteilt ist alles in Ordnung:

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

Eine andere Lösung, die NOT NULL Zwang zu nehmen war. In diesem Fall gibt create ohne Fehler zurück, und wenn ich den Datensatz später ansehe, werden die Zeitstempel gesetzt. ActiveRecord muss den Datensatz zunächst ohne Zeitstempel speichern und dann zurückgehen und einfügen. (Schienen 4.2.5)

Verwandte Themen