0

Rails 3 でテキスト アドベンチャー ゲームを作成しようとしています (はい、ばかげていることはわかっています)。現在、Room というモデルがあります。各部屋は、最大 4 つの他の部屋に関連付ける必要があります。この関係は双方向であり、関連する 2 つの部屋は互いに出口になります。たとえば、次のように言うとします。

@room1.north = @room2

@room2.south は自動的に @room1 になります。同様に、私が言うなら:

@room1.east = nil

@room2.west も nil になります。コントローラーで手動で行うのではなく、モデルの関連付けのみを使用してこれを実現したいと考えています。これは可能ですか?

編集

matzi が提供する最初の例は、私が望むようには機能しません。次の点を考慮してください。

class Room < ActiveRecord::Base
  attr_accessible :north, :south, :east, :west

  has_one :north, :class_name => "Room", :foreign_key => "south_id"
  has_one :east, :class_name => "Room", :foreign_key => "west_id"

  belongs_to :south, :class_name => "Room", :foreign_key => "south_id"
  belongs_to :west, :class_name => "Room", :foreign_key => "west_id"
end

@room1 = Room.new
@room2 = Room.new
@room1.save
@room2.save

これはうまくいきます:

@room1.north = @room2

@room1.north #Outputs @room2
@room2.south #Outputs @room1

@room1.north = nil

@room1.north #Outputs nil
@room2.south #Outputs nil

ここまでは順調ですね。しかし:

@room1.north = @room2

@room2.south = nil

@room1.north #Outputs @room2, but it should be nil
@room2.south #Outputs nil

さらに:

@room2.south = @room1

@room1.north #Outputs nil, but it should be @room2
@room2.south #Outputs @room1

ここに問題がありますか?これは真の双方向ではありません。

解決した

結局、Matzi の最初の解決策は正しかったことがわかりました。彼が指摘したように、私がそのソリューションで抱えていた問題は節約の 1 つでした。以下の作品:

@room1 = Room.create
@room2 = Room.create
@room1.north = @room2
@room1.save

Room.find(1).north #Room 2
Room.find(2).south #Room 1

@room2.south = nil
@room2.save

Room.find(1).north #nil
Room.find(2).south #nil
4

1 に答える 1

0

もちろん可能です。4 つすべてを使用する必要はないため、ID (north_id と East_id) を保持する 2 つの方向 (たとえば、北と東) を選択します。次に、 を使用して関係を設定し:foreign_keyます。has_one は反対側の ID 名をマークし、belongs_to は同じオブジェクトの ID をマークするため、ID に注意してください。

それはうまくいくはずです:

has_one :south, :class_name => 'Room', :foreign_key => 'north_id'
belongs_to :north, :class_name => 'Room', :foreign_key => 'north_id'

ただし、コネクタ モデルと HABTM 関係を使用することをお勧めします。このモデルは、方向に関する情報を保持でき、より柔軟に対応できます。たとえば、「北」の入り口が 2 つある部屋を作成したり、一方通行の接続を定義したりすることはできません。それを使用すると、特定の接続を見つけて、好きなように変更することもできます。この単純なグリッドのようなより複雑な構造が必要な場合は、これを検討してください。

于 2012-07-15T20:33:43.783 に答える