Я новичок в рельсах, так что остерегайтесь уродливого кода.У меня есть эти модели
class User < ActiveRecord::Base
has_many :games_playeds
has_many :games, :through => :games_playeds
end
class Game < ActiveRecord::Base
has_many :games_playeds
has_many :users, :through => :games_playeds
end
class GamesPlayed < ActiveRecord::Base
validates_presence_of :user_id, :game_id
belongs_to :user
belongs_to :game
end
Игра описывает игру независимо от любого пользователя. GamesPlayed описывает, как пользователи вели себя в этой игре (смерти, текущий этап, победы и т. Д.)
На каждом этапе этогоВ игре пользователь может выбрать один из нескольких вариантов, некоторые перейдут на более поздние этапы, некоторые заставят его вернуться.Дело в том, что, когда выбор сделан на одном этапе, я не позволяю выбирать что-либо еще.Для реализации этого у меня есть атрибут steps, который кодирует предыдущие варианты выбора, такие как «0: 1; 1: 6; 6: 2» и так далее.Этот атрибут в модели GamesPlayed.
Страницы, по которым пользователь перемещается, создаются автоматически, поэтому я не знаю их имен, но знаю, что они называются XX_to_YY.У меня в контроллере есть метод, который получит их все и сделает что-то уродливое:
#get the game name, we have several games
game = Game.find_by_name (params[:game])
#get the previous and current stage
from, to = params[:page].to_s.split("_to_")
to = to.split(".html")[0]
played = current_user.games_playeds.find_by_game_id (game.id)
steps = []
played.steps.split(";").each {|a| steps << a.split(":").first}
if steps.include? from
render :inline => "You already chose for this, go back"
else
played.steps << "#{from}:#{to};"
played.save
# pl = current_user.games_playeds.find_by_game_id (game.id)
# raise pl.steps
render "games/choosePath/#{game.name}/#{params[:page]}.html"
end
Я думаю, это ужасный код.Я также новичок в Ruby: P
Теперь вопрос: Play.save не дает мне ошибок.
# pl = current_user.games_playeds.find_by_game_id (game.id)
# raise pl.steps
будет «печатать» правильные данные, но они не сохраняются в базе данных!Я использую sqlitebrowser для визуальной проверки, и я уверен, что он не сохранен.
Кстати, второй вопрос, если кто-то знает, как добраться до объекта ассоциации без этого уродливого кода, приведенного выше, также очень благодарен.
и третий и последний вопрос:
steps = [] plays.steps.split (";"). Each {| a |steps << a.split (":"). first} </p>
Это тоже ужасно, но я не знаю, как сделать это лучше (хочу получить aa и bb от "aa: cc; bb:dd; "Я не знаю, что такое aa и bb, это могут быть цифры или слова.