如何在Ruby中引用对象的"Owner"?

How to refer to an object's "Owner" in Ruby?

"Owner" 可能不是正确的术语,但我不知道是什么,所以搜索起来非常困难。

我在做一个纸牌游戏,每个玩家可以有多张手牌。

我有一个 "Player," "Hand," 和 "Card" 类。

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 上调用的属性或方法,它会引用其 "owner"、player1?

我期待

hand1.owner

=> #<Player:0x007fb6ae05b448
# @behavior=:human,
# @hands=[#<Hand:0x007fb6ad8653b0 @cards=[{:A,:spades},{:Q,:hearts}]>],
# @money=800,
# @name="Dougie Jones">

不行,没办法。一个对象不知道你把它放在哪里。你可能把它放在很多不同的地方,那么谁是主人呢?您需要手动设置关系或考虑更改设计。

考虑一下:

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>

您可以交叉引用具有属性的对象。 (每个 Hand 对象都可以引用特定的 Player 对象)

例如,您可以向 Hand 模型添加一个属性:

class Hand
  attr_accessor :player
end

然后当你创建一个新的Hand时,你可以设置player:

player1 = Player.new
hand1 = Hand.new
hand1.player = player1

这基本上就是 ActiveRecord associations 的工作方式。