“所有者”可能不是正确的术语,但我不知道是什么让搜索变得非常困难。
我正在进行纸牌游戏,每个玩家都可以拥有多手牌。
我有一个“玩家”,“手”和“卡”类。
player1 = Player.new
hand1 = Hand.new # => A new hand of two random cards
player1.hands.push(hand1)
#Now player1 has one hand with two cards in it.
我可以在hand1上调用一个属性或方法来引用它的“所有者”,播放器1吗?
我期待像
这样的东西hand1.owner
=> #<Player:0x007fb6ae05b448
# @behavior=:human,
# @hands=[#<Hand:0x007fb6ad8653b0 @cards=[{:A,:spades},{:Q,:hearts}]>],
# @money=800,
# @name="Dougie Jones">
答案 0 :(得分:1)
不,没有办法。一个物体不知道你保留它的位置。您可以将它保存在许多不同的地方,那么谁将成为所有者?您需要手动设置关系或考虑更改设计。
考虑一下:
class Player
attr_accessor :hands
def initialize
@hands = []
end
def add_hand(hand)
hand.player = self
@hands << hand
end
end
class Hand
attr_accessor :player
end
player = Player.new
hand = Hand.new
player.add_hand(hand)
puts hand.player #=> #<Player:0x000000017b2978>
答案 1 :(得分:1)
您可以使用属性交叉引用对象。 (每个Hand
对象都可以引用特定的Player
对象)
例如,您可以向Hand
模型添加属性:
class Hand
attr_accessor :player
end
然后,当您创建新的Hand
时,您可以设置player
:
player1 = Player.new
hand1 = Hand.new
hand1.player = player1
这基本上是ActiveRecord associations的工作方式。