我正在尝试使用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