2010-11-01 36 views
2

假設我有以下的模型關係:的Rails:請給一個DB行不同的引用指向同一個Ruby對象

class Player < ActiveRecord::Base 
    has_many :cards 
end 

class Card < ActiveRecord::Base 
    belongs_to :player 
end 

我知道,從this question是Rails會回到我對象的副本代表數據庫行,這意味着:

p = Player.find(:first) 
c = p.cards[0] 
c.player.object_id == p.object_id # => false 

...,因此,如果玩家模型修改self,和卡模式在同一個請求修改self.player,那麼modifi陽離子不會相互通知,最後保存的將覆蓋其他。

我想解決這個問題(大概是採用某種形式的緩存),以便具有給定id的Player的所有請求都會返回相同的對象(相同的object_ids),從而允許兩個模型編輯相同的對象對象,而無需執行數據庫保存並重新加載。我有三個問題:

  1. 是否已有插件或寶石來做到這一點?
  2. 有沒有很好的理由爲什麼我不應該做到這一點?
  3. 任何人都可以給我一些關於如何去做這件事的指針嗎?
+0

您能否更好地解釋從播放器對象和卡對象編輯播放器的用例? – rwilliams 2010-11-06 09:56:52

+0

查看鏈接的問題。假設它需要玩家1的行動來玩一張卡片,並且有一種特殊類型的卡片在你玩遊戲時授予2個動作。然後我想在Player中執行'self.actions - = 1',在Card子類中執行'player.actions + = 1'。 – Chowlett 2010-11-09 09:27:35

回答

3

這在Rails 3.x支持。例如,您可以將:inverse_of選項用於has_many關聯。 Documentation here(搜索:inverse_ofBi-directional associations)。

+0

好的,是的,這看起來像是有效的。我需要做的就是通過適當的關聯擴展來完成並替換一些構造(我有單獨的'hand_cards和deck_cards'has_many關係)。無論如何我應該這樣做。一旦我放棄了,賞金就是你的。 – Chowlett 2010-11-09 09:58:16

相關問題