2016-03-20 31 views
0

我有一個模型user_item,其屬性名爲:primary_image_id。 A user_itemhas_manyuser_item_imagesprimary_image_id的目的是將其設置爲等於user_item_images之一的id,這樣我就可以使用邏輯,以便用戶在視圖中不能刪除對象。Rails - 在創建時一起創建基於子id的父屬性

A user_item應該永遠不存在沒有這個屬性集,或者至少存在幾秒鐘,直到設置屬性。在我的表格中,user_itemuser_item_images一起創建。

看起來像user_item_image.id只是在創建後才設置。我試圖在user_item

def set_primary_image_id 
    self.primary_image_id = self.user_item_images.first.id 
    end 

做一個after_create回調,但似乎並沒有工作,我猜是因爲孩子wan't創建,所以沒有一個ID。

我想我可以做一個after_create回調的user_item_image模型,是這樣的:

def set_user_item_primary_image_id 
    user_item = self.user_item 
    user_item.primary_image_id = user_item.user_item_images.first.id 
end 

但是這似乎有點小題大做,因爲它真的不應該做的每創建一個user_item_image時間。

回答

1

您的after_create s可能會正確設置該字段,但它們不會向數據庫寫入任何內容。嘗試:

update_attributes(primary_image_id: user_item_images.first.id) 

如果user_item_images存在創建user_item之前,你也可以設置字段中before_create,避免了第二寫入查詢的需要。無論你做什麼,撒上一些印刷品或放入調試器來檢查你是否沒有數據而不寫它。

如果你一次性使用build創造的一切,將創建的所有對象和之前UserItem#set_user_item_primary_image_id運行有ID的,所以這會工作得很好:

ui = UserItem.new(params[:user_item]) 
image = ui.user_item_images.build(params[:user_item_image]) 
ui.save # Creates UserItem, creates UserItemImage, assigns primary_image_id 

爲了讓這個更清潔,檢查出accepts_nested_attributes_for

+0

我有一個嵌套表單,它在提交時創建屬於user_item的'user_item'和'user_item_images'。如果我在'user_item'模型上放置'after_create',這會發生在整個事務之後,還是會在'user_items'子項存在之前發生? – user4584963

+0

使用'build',一旦所有東西都有你需要的ID,'after_create'就會運行。 –