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