2012-10-19 12 views
9

में रिकॉर्ड डालने पर कॉलम "create_at" कॉलम में शून्य मान मेरे पास 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 मॉडल से timestamps को दूर करना चाहिए?

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 

क्या मुझे यह एक और तरीका करना चाहिए?

उत्तर

7

अपने समाधान के लिए नीचे दिए गए लिंक देखें।

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

हमें t.timestamps का उपयोग क्यों नहीं करना है? – albertopriore

+0

एचएबीटीएम के लिए यह रिलेशनशिप टेबल है ताकि हम यहां टाइमस्टैम्प का उपयोग न कर सकें। यदि हम टाइमस्टैम्प का उपयोग करना चाहते हैं तो has_many का उपयोग करें: हालांकि रिश्ते –

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 

तो आप टाइमस्टैम्प का उपयोग करने में सक्षम होंगे।

0

मेरा उत्तर ओपी के सवाल का बिल्कुल जवाब नहीं देता है, लेकिन यह संदेश तब होता है जब त्रुटि संदेश गुगलता है, इसलिए मैं वैसे भी जवाब दे रहा हूं।

मुझे has_many रिश्ते मिल गया है। मान लें कि हम Parent मॉडल, और अभिभावक has_many :child_models का उपयोग कर रहे हैं।

जब मैं

@parent.child_models.create(params) 

फोन तो Postgres के बारे में शून्य मान शिकायत। लेकिन अगर मैं उसे विभाजित करें सब कुछ ठीक है:

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

एक अन्य समाधान NOT NULL बाधा बाहर निकालने के लिए किया गया था। उस स्थिति में create त्रुटि के बिना लौटाता है, और जब मैं बाद में रिकॉर्ड देखता हूं तो टाइमस्टैम्प सेट होते हैं। ActiveRecord शुरुआत में टाइमस्टैम्प के बिना रिकॉर्ड सहेजना चाहिए, और फिर वापस जाकर उन्हें डालना चाहिए। (रेल 4.2.5)

संबंधित मुद्दे