rails has_many: через таблицу не сохраняются - PullRequest
0 голосов
/ 16 февраля 2011

Я новичок в рельсах, так что остерегайтесь уродливого кода.У меня есть эти модели

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, это могут быть цифры или слова.

1 Ответ

1 голос
/ 16 февраля 2011

Если вы хотите вызвать исключение при сбое save, позвоните save!; в противном случае, если вы продолжите использовать save, вы должны проверить возвращенное логическое значение, чтобы увидеть, было ли сохранение успешным.

A false возвращаемое значение будет означать, что проверки не пройдены. Детали сбоев будут в информации об ошибках на модели.


Об улучшении ассоциации: возможно, вы могли бы что-то сделать с областями видимости или даже просто написать метод для инкапсуляции того, что вы пытаетесь сделать.


Что касается декодирования шагов, вы можете использовать inject вместо each, но это все равно будет довольно логично. Я бы предложил заключить его в метод с описательным именем, например decode_steps или аналогичный.

...