0

あるモデルでは、これがあります:

class Game < ActiveRecord::Base
  has_one :turn

  attr_accessor :turn
  attr_accessible :turn

  default_scope :include => :turn

  def Game.new_game
    turn = Turn.create count: 1, phase: 'upkeep', player: 1
    game = Game.create turn: turn
    game
  end
end

class Turn < ActiveRecord::Base
  belongs_to :game
end

後で、コントローラーで、私はこれを持っています:

respond_with Game.find(params[:id])

しかし、何らかの理由で、返されたゲームには関連付けられたオブジェクトturn_idがありません。nilturn

関連付けが適切に保存されない、または で適切に返されないのはなぜfind()ですか?

私の移行では、関連付けを正しくセットアップしたと思います。

create_table :games do |t|
   t.timestamps
end

def change
 create_table :turns do |t|
   t.string :phase
   t.integer :count

   t.references :game
   t.timestamps
 end

終わり

4

2 に答える 2

0

何かが反転しています。

Turn には belongs_to ステートメントがあるため、Turn には game_id が含まれている必要があり、その逆ではありません。

フィールドが存在しないため、ゲームの turn_id にアクセスできません。これは常に nil で、 has_one ステートメントを削除すると例外が発生します。

于 2012-08-22T16:04:26.507 に答える
0

あなたは協会を台無しにしてしまったようです

これは、シナリオの理解に従って私が考えるものです。

協会は次のようにする必要があります

class Game < ActiveRecord::Base
  has_one :turn

  #.....
end

class Turn < ActiveRecord::Base
  belongs_to :game
  #.....
end

とのような移行

create_table :games do |t|
  #add some columns
  t.timestamps
end


create_table :turns do |t|
  t.references :game
  #add some columns
  t.timestamps
end

今すぐ新しいゲームとターンを追加します

    game = Game.create 
    turn = game.turn.create  count: 1, phase: 'upkeep', player: 1

game.tun.creategame_id = game.idおよびその他の指定された引数を使用してターン レコードを自動的に作成します。

あなたの移行の問題は、ゲームが反対のターンを参照していることです。

アソシエーションについて詳しくはこちら http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html http://guides.rubyonrails.org/association_basics.html

于 2012-08-14T18:17:00.477 に答える