Как правильно проектировать различные «виды» модели? - PullRequest
0 голосов
/ 01 мая 2009

Под «представлением» здесь я подразумеваю различные комбинации свойств модели, а не представление традиционного MVC. Например, у меня есть следующая модель:

class Game < ActiveRecord::Base
  has_many :players
  belongs_to :status
  has_one :deck
  has_many :turns
  has_one :current_turn, :class_name => 'Turn', :conditions => ['turn_num = ?', '#{self.turn_num}']
end

Я написал full_xml метод для Game, который я использую для «нормальной» операции get, чтобы я мог включить определенные свойства игроков и current_turn, и тогда мне не нужно делать GET для каждого игрока все время. Я также не хочу включать ВСЕ свойства, а также свойства детей и детей модели Game в каждый GET

Теперь, однако, я хочу получить историю игр, которая включает все ходы (и их свойства / дочерние элементы). Сначала я подумал о новой модели без соответствующей таблицы, а затем понял, что в этом нет необходимости, потому что данные и взаимосвязи уже есть в игре и меняет модели. Я также подумал о написании нового действия, но мне показалось, что я где-то читал, что в мире RESTful не следует писать никаких действий, кроме ядра 7.

Кстати, я думаю о возвращении xml, потому что я использую интерфейс Flex вместо представлений rails.

Ответы [ 2 ]

1 голос
/ 01 мая 2009

Да, вложенные ресурсы были ответом. Этот Railscast объясняет это хорошо. Я кратко пробовал вложенные ресурсы раньше и не мог заставить его работать. Он возвращал все дочерние ресурсы, а не только вложенный ресурс родительского ресурса. Это потому, что я предполагал, что Rails автоматически делает это для меня, а это не так. Railscast объясняет, что вам все еще необходимо внести изменения в контроллер дочерних ресурсов, например:

class TurnsController < ApplicationController
  # GET /turns
  # GET /turns.xml
  def index
    @game = Game.find(params[:game_id])
    @turns = @game.turns

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @turns.to_xml( :except => [:created_at, :updated_at] ) }
    end
  end
  ... more methods
end

Вы также должны отредактировать свой файл rout.rb. В этом случае мне нужны вложенные маршруты для игроков и ходов игры, поэтому я сделал это:

map.resources :games do |game|
    game.resources :players
    game.resources :turns
end
1 голос
/ 01 мая 2009

У вас есть несколько вариантов здесь - я бы использовал «вложенные ресурсы», чтобы вы получили маршрут / game /: game_id / turn, который вызывает «index» на контроллере Turns. Другой вариант - создать контроллер GameHistory, который может быть полезен, если с историей вашей игры связана дополнительная логика.

Нет однозначного соответствия между контроллерами и моделями; однако существует однозначное соответствие между контроллерами и РЕСУРСАМИ. История игры - это совершенно другой ресурс, нежели игра, так же, как ресурс сеанса пользователя отличается от фактического ресурса пользователя (обычно он используется для обеспечения входа в RESTful, а также управления пользователями RESTful). Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...