Я нашел обходной путь, если (как и я) вы готовы отказаться от оптимизации SQL, предоставленной Arel, и просто сделать все это в 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