0

當銷燬我有一個4級深的模型結構的多層次關係:域>主題>設備>屬性Rails的更新

class Domain < ApplicationRecord 
    has_many :subjects 
    end 

    class Subject < ApplicationRecord 
    has_many :devices 
    belongs_to: :domain 
    end 

    class Device < ApplicationRecord 
    has_many :properties 
    belongs_to: :subject 
    end 

    class Property < ApplicationRecord 
    belongs_to :device 
    end 

控制器代碼

def update 
    result = @subject.update(parameters) 
    if result 
    render json: @subject 
    else 
    render_errors(@subject.errors) 
    end 
end 

@subject被檢索爲前動作,通過從域向前查詢模型樹,分別使用domain_idid參數爲域和主題。 parameters只是參數的散列,例如, {name: :new_name}

更新主題時,與域的關係丟失,即domain_id被設置爲NUL。結果,下面的主題中的整個模型樹也將與父域斷開連接。

從主體模型中刪除has_many: :devices時,一切都按預期工作。我只想更新一個主題並保留與父域的關係。我如何用上述模型實現這一目標?

編輯1 - 增加了這兩種情況的日誌。

登錄全關係模型(即導致錯誤)

Domain Load (0.5ms) SELECT "domains".* FROM "domains" WHERE "domains"."name" = ? LIMIT ? [["name", "Manatree"], ["LIMIT", 1]] 
    CACHE (0.0ms) SELECT "domains".* FROM "domains" WHERE "domains"."name" = ? LIMIT ? [["name", "Manatree"], ["LIMIT", 1]] 
    Subject Load (0.0ms) SELECT "subjects".* FROM "subjects" WHERE "subjects"."domain_id" = ? AND "subjects"."name" = ? LIMIT ? [["domain_id", 3], ["name", "s1"], ["LIMIT", 1]] 
    Subject Load (0.5ms) SELECT "subjects".* FROM "subjects" WHERE "subjects"."id" = ? LIMIT ? [["id", 5], ["LIMIT", 1]] 
    (0.0ms) begin transaction 
    Domain Load (0.0ms) SELECT "domains".* FROM "domains" WHERE "domains"."id" = ? LIMIT ? [["id", 3], ["LIMIT", 1]] 
    SQL (7.1ms) UPDATE "subjects" SET "domain_id" = NULL WHERE "subjects"."domain_id" = ? AND "subjects"."id" = 5 [["domain_id", 3]] 
    Subject Exists (0.0ms) SELECT 1 AS one FROM "subjects" WHERE "subjects"."domain_id" = ? AND "subjects"."name" = ? LIMIT ? [["domain_id", 3], ["name", "s2"], ["LIMIT", 1]] 
    SQL (1.0ms) UPDATE "subjects" SET "name" = ?, "updated_at" = ? WHERE "subjects"."id" = ? [["name", "s2"], ["updated_at", "2017-07-31 08:46:38.171240"], ["id", 5]] 
    (7.5ms) commit transaction 
    Subject Load (0.0ms) SELECT "subjects".* FROM "subjects" 
Completed 200 OK in 30ms (Views: 0.5ms | ActiveRecord: 16.6ms) 

登錄時從主題模型中移除belongs_to: :devices

Domain Load (0.0ms) SELECT "domains".* FROM "domains" WHERE "domains"."name" = ? LIMIT ? [["name", "Manatree"], ["LIMIT", 1]] 
    CACHE (0.0ms) SELECT "domains".* FROM "domains" WHERE "domains"."name" = ? LIMIT ? [["name", "Manatree"], ["LIMIT", 1]] 
    Subject Load (0.5ms) SELECT "subjects".* FROM "subjects" WHERE "subjects"."domain_id" = ? AND "subjects"."name" = ? LIMIT ? [["domain_id", 3], ["name", "s3"], ["LIMIT", 1]] 
    Subject Load (0.5ms) SELECT "subjects".* FROM "subjects" WHERE "subjects"."id" = ? LIMIT ? [["id", 6], ["LIMIT", 1]] 
    (0.0ms) begin transaction 
    Domain Load (0.5ms) SELECT "domains".* FROM "domains" WHERE "domains"."id" = ? LIMIT ? [["id", 3], ["LIMIT", 1]] 
    SQL (6.5ms) UPDATE "subjects" SET "name" = ?, "updated_at" = ? WHERE "subjects"."id" = ? [["name", "s4"], ["updated_at", "2017-07-31 08:48:57.962218"], ["id", 6]] 
    (7.0ms) commit transaction 
    Subject Load (0.0ms) SELECT "subjects".* FROM "subjects" 
Completed 200 OK in 25ms (Views: 0.4ms | ActiveRecord: 15.1ms) 

編輯2 - 可能有一些錯誤的種子數據...

domainA = Domain.create(name: :company) 
s1 = domainA.subjects.create(name: :subject) 
# domainA.save 
d1 = s1.devices.create(name: :device) 
# s1.save 
p1 = d1.properties.create(name: :prop1, property_type: :double, value: 10.0) 
p2 = d1.properties.create(name: :prop2, property_type: :string, value: :on) 
p3 = d1.properties.create(name: :prop3, property_type: :string, value: :Lamp) 
# d1.save 
domainA.save 
+0

當您在Rail控制檯中保存主題實例時會發生這種情況嗎? – Snake

+0

爲什麼'domain_id'被設置爲'nil'?你發送了什麼參數,什麼是「SubjectsController」(假設你所說的錯誤是來自控制器動作)?我沒有看到如何移除'has_many:devices'應該完全影響這種行爲。你可以嘗試提供[mcve]嗎? –

+0

參數是一種方法嗎?如果是這樣,請告訴我們該代碼。此外,生成的日誌也應該有所幫助。 – Pavan

回答

1

當從主體模型中刪除has_many ::設備時,所有內容 都按預期工作。

繼續您的模型,您的Device模型是有缺陷的。您在Device內有belongs_to :device。也許你應該有belongs_to :subject根據協會。這可能會導致你目前的問題。嘗試更改Device模型,就像這樣

class Device < ApplicationRecord 
    has_many :properties 
    belongs_to: :subject 
end 
+0

「設備」模型中的缺陷是一個錯字... The代碼實際上就像您所描述的那樣,即您的建議不能很好地解決問題 已更新quesiton說明。 –

+0

@KevinvandenBekerom好的。告訴我們你如何更新主題。必要的代碼和日誌應該有所幫助 – Pavan