Я пытаюсь создать небольшую игру с поворотом по 2 игрока, используя Rails, для инициализации игры требуется только 1 игрок, который установит поле, к которому может присоединиться другой игрок. Каждый игрок в игре будет иметь земли, которая может содержать здания, отношения между ними следующим образом:Rails manual commit records
#Game
has_many :lands
#Land
belongs_to :game
has_many :buildings
#Building
belongs_to :game
Только игра имеет контроллер, так как это мастер их всех, так что, когда игра должна быть инициализированный запрос будет содержать информацию для создания земли и зданий, и все они рассматриваются как единое целое, поэтому, если одна из этих записей выходит из строя, я не хочу ничего совершать. Я думал об использовании building.save if land.save
, но это вызовет ошибку, так как я сохраняю здание на земле, которая не выходит, но если я сначала сэкономлю землю, а здание потерпит неудачу, мне нужно будет удалить землю и игру, это усложняется с несколькими зданиями и различными ошибками, поступающими из разных мест, чтобы справиться со всеми этими условиями.
Какие еще варианты можно использовать для достижения этого?
Edit: Игровой контроллер будет что-то вроде этого:
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