1

私はRubyonRails 3を初めて使用し、単純なチェスゲームアプリケーションに取り組んでいます。次のモデルを作成する予定です。

rails g model Player name:string
rails g model Game player_id_white:int player_id_black:int title:string
rails g model Comment player_id:int game_id:int comment_data:text
rails g model Move game_id:int player_id:int move_data:string

それらがすべて持っていると仮定します:id:int:primary_key、c​​reated_at:datetime、updated_at:datetime。'password_hash'などのフィールドも省略しました。私の問題は関連付けにあり、アプリを機能させるために必要なフィールドにはあまり関係ありません。

class Player < ActiveRecord::Base
  has_many :games #some have player_id_black, others as player_id_white
  has_many :comments
  has_many :moves
end

class Game < ActiveRecord::Base
  has_many :comments
  has_many: moves
  **belongs_to :player1??**
  **belongs_to :player2??**
end

class Comment < ActiveRecord::Base
  belongs_to :player
  belongs_to :game
end

class Move < ActiveRecord::Base
  belongs_to :player
  belongs_to :game
end

質問:

1)ゲームを2人のプレーヤーにリンクしたいのですが、どうすればその関係を指定できますか?
2)「railsgenerate model」でgame_id:intのようなものを指定する必要がありますか、それとも関係(belongs_to:player、has_many:games)を行うときに暗黙的ですか?

ありがとう!

4

3 に答える 3

4

上記の移行を考えると、ゲーム モデルを次のように設定する必要があります。

class Game < ActiveRecord::Base
  has_many :comments
  has_many :moves
  belongs_to :white_player, :class_name => 'Player', :foreign_key => 'player_id_white'
  belongs_to :black_player, :class_name => 'Player', :foreign_key => 'player_id_black'
end

これにより、カスタムの外部キーが使用され、各関連付けを単一の belongs_to 呼び出しとしてリンクできるようになります。

または、レールにforeign_key設定を「推測」させたい場合は、次のように移行を設定する必要があります。

rails g model Game white_player_id:integer black_player_id:integer title:string

これを行う場合でも、begins_to 呼び出しごとに :class_name => 'Player' オプションを指定する必要があります。

于 2011-10-06T19:28:37.207 に答える
2

Rails は初めてで、チェス アプリを作成しています。Player と Games の間の has_and_belongs_to_many 関係を使い始めましたが、白人と黒人のプレーヤーの役割をこのように適切にモデル化する方法がわかりませんでした。

プレイヤーからゲームへの関係をたどる方法が必要だったため、ロボが提案したものとは異なるアプローチを使用することになりました。

まず、Seats という 3 番目のモデルを追加し、次に Player と Game モデルを設定して、次のような has_many :through 関係を持たせました。

class Game < ActiveRecord::Base
  has_many :seats
  has_many :players, :through => :seats
end

class Player < ActiveRecord::Base
  has_many :seats
  has_many :games, :through => :seats
end

class Seat < ActiveRecord::Base
  belongs_to :game
  belongs_to :player
end

これにより、game.players と player.games が機能するようにモデルがセットアップされます。

白人と黒人のプレーヤーを追跡するために、座席表に色の列を追加しました。

create_table "seats", :force => true do |t|
  t.integer  "player_id"
  t.integer  "game_id"
  t.integer  "color"
  t.datetime "created_at", :null => false
end

次に、ゲーム モデルにいくつかのヘルパー メソッドを追加して、game.white_player で白人プレイヤーを取得し、game.white_player = foo で設定できるようにしました。

class Game < ActiveRecord::Base
...
def white_player
  Player.joins(:games).where(:seats => {:color => 0, :game_id => self.id}).first
end

def white_player=(player)
  self.players << player

  s = self.seats.find_by_player_id(player)
  s.color = 0
  s.save
end

これが最善のアプローチかどうかはわかりませんが、私の要件を満たしているようです。

game.players # returns game's players
player.games # returns player's games
game.white_player # returns the white player
game.white_player = player # sets the white player

これを改善する方法があれば知りたいです。

于 2013-01-28T02:36:38.700 に答える
0

Game クラスに次のような 2 つのフィールドを追加します。

belongs_to :player_one, :class_name => "Player"
belongs_to :player_two, :class_name => "Player"

これは、DB に 2 つの整数フィールドがあることを意味します。player_one int, player_two int

他のモデルは変更する必要はありません。

于 2011-10-06T19:29:02.003 に答える