Rails :: inverse_of和Association扩展

我有以下设置

class Player  :player do def in_hand find_all_by_location('hand') end end end class Card  :cards end 

这意味着以下工作:

 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 

但以下行为方式不同:

 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 

如何使:inverse_of关系扩展到扩展方法? (这只是一个错误吗?)

它不起作用,因为“in_hand”方法有一个返回数据库的查询。

由于inverse_of选项,工作代码知道如何使用已经在内存中的对象。

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

我找到了一个解决方法,如果(我是)你愿意放弃Arel授予的SQL优化,只需在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 

通过在Ruby中编写扩展来过滤关联的完整结果,而不是缩小SQL查询,扩展返回的结果正确地表现为: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