2010-11-10 7 views
9

ich die folgenden Set-upRails: inverse_of und Assoziierungs Erweiterungen

class Player < ActiveRecord::Base 
    has_many :cards, :inverse_of => :player do 
    def in_hand 
     find_all_by_location('hand') 
    end 
    end 
end 

class Card < ActiveRecord::Base 
    belongs_to :player, :inverse_of => :cards 
end 

Das bedeutet, die folgenden Werke:

p = Player.find(:first) 
c = p.cards[0] 
p.score # => 2 
c.player.score # => 2 
p.score += 1 
c.player.score # => 3 
c.player.score += 2 
p.score # => 5 

Aber die folgenden nicht die gleiche Art und Weise verhalten:

p = Player.find(:first) 
c = p.cards.in_hand[0] 
p.score # => 2 
c.player.score # => 2 
p.score += 1 
c.player.score # => 2 
c.player.score += 2 
p.score # => 3 

d = p.cards.in_hand[1] 
d.player.score # => 2 

Wie kann ich die :inverse_of Beziehung zu den Erweiterungsmethoden erweitern? (Ist das nur ein Bug?)

Antwort

7

Ich habe eine Abhilfe, wenn (wie ich) haben Sie die SQL-Optimierung von Arel gewährt bereit sind, aufgeben gefunden und tun einfach alles in Ruby.

class Player < ActiveRecord::Base 
    has_many :cards, :inverse_of => :player do 
    def in_hand 
     select {|c| c.location == 'hand'} 
    end 
    end 
end 

class Card < ActiveRecord::Base 
    belongs_to :player, :inverse_of => :cards 
end 

Durch die Erweiterung Schreiben der vollständigen Ergebnisse des Vereins in Ruby zu filtern, anstatt verengt die SQL-Abfrage nach unten, durch die Erweiterung zurückgegebenen Ergebnisse verhalten sich korrekt mit :inverse_of:

p = Player.find(:first) 
c = p.cards[0] 
p.score # => 2 
c.player.score # => 2 
p.score += 1 
c.player.score # => 3 
c.player.score += 2 
p.score # => 5 

d = p.cards.in_hand[0] 
d.player.score # => 5 
d.player.score += 3 
c.player.score # => 8 
Verwandte Themen