我正在嘗試使用Rails構建一個小型2人回合制遊戲,初始化遊戲時只需要1名玩家設置該字段,然後另一名玩家可以加入。在遊戲中的每個玩家都會有,它可以包含建築物的土地,如下它們之間的關係:Rails手動提交記錄
#Game
has_many :lands
#Land
belongs_to :game
has_many :buildings
#Building
belongs_to :game
只有遊戲控制器,因爲這是他們所有的高手,所以當一個遊戲是要初始化請求將包含創建土地和建築物的信息,並且所有都被視爲一個,所以如果其中一個記錄失敗,我不想提交任何內容。我想過使用building.save if land.save
,但它會產生錯誤,因爲我正在將建築物保存到不會退出的土地,但如果我先保存土地並且建築物失敗,那麼我需要刪除土地和遊戲,隨着多個建築物的進行以及來自多個地點的各種錯誤來處理所有這些情況而變得複雜。
我可以用其他什麼方法來達到這個目的?
編輯: 遊戲控制器將是這樣的:
class GamesController < ApplicationController
def create
#generate new land to contain buildings
land = Land.new(user: @current_user)
#generate new buildings from array of hashes, contains coords+land_id
buildings = []
params[:buildings].each do |building|
buildings.push Building.new(building.merge!({land: land}))
end
game = Game.new(user_1: @current_user, land_1: land)
land.game = game #set the game it belongs to
#some code here to save land+game+buildings
#if one of them failed then nothing is saved at all.
end
end
還有,我救不了這樣的比賽,因爲它證明了土地的存在,並不能節約土地的問題,因爲它驗證遊戲的存在,同樣適用於他們驗證土地存在的建築物。所以我需要一個能夠一次性保存它們的代碼,並且仍然能夠成功驗證它們。
你能在這裏添加一些實際的代碼嗎?它比你試圖描述你的控制器中發生了什麼更容易閱讀。 – max
我還沒有編寫遊戲控制器,這是我堅持如何寫在一個方式來實現所提到的,我會嘗試用一般形式更新我如何認爲它會出現。 –
你認爲你可以改變你的問題嗎?這聽起來像是你正在尋找交易,然後我再次只能理解問題的1/10。 – max