Simulando has_and_belongs_to_many comportamiento anidado en Rails 3

Entonces Rails no tiene soporte para: a través de asociaciones a través de una relación habtm. Hay complementos que agregarán esto para Rails 2.x, pero estoy usando Rails 3 / Edge, y solo necesito la asociación para un modelo en particular. Así que pensé en confundirme con la belleza que es Arel.

Primero, los modelos:

class CardSet < ActiveRecord::Base
  has_and_belongs_to_many :cards, :uniq => true
end

class Card < ActiveRecord::Base
  has_and_belongs_to_many :card_sets, :uniq => true
  has_many :learnings, :dependent => :destroy
end

class Learning < ActiveRecord::Base
  belongs_to :card
end

Quiero obtener todos los aprendizajes que pertenecen a un conjunto de tarjetas en particular: a través de => tarjetas.

Esto es lo que tengo hasta ahora en mi modelo CardSet:

def learnings
  c = Table(Card.table_name)
  l = Table(Learning.table_name)
  j = Table(self.class.send(:join_table_name, Card.table_name, CardSet.table_name))
  learning_sql = l.where(l[:card_id].eq(c[:id])).where(c[:id].eq(j[:card_id])).join(j).on(j[:card_set_id].eq(self.id)).to_sql
  Learning.find_by_sql(learning_sql)
end

lo que me da (maldición, ¡Arel es hermosa!):

SELECT     `learnings`.`id`, `learnings`.`card_id`, `learnings`.`user_id`, `learnings`.`ef`, `learnings`.`times_seen`, `learnings`.`next_to_be_seen`, `learnings`.`interval`, `learnings`.`reps`, `learnings`.`created_at`, `learnings`.`updated_at`, `card_sets_cards`.`card_set_id`, `card_sets_cards`.`card_id` FROM       `learnings` INNER JOIN `card_sets_cards` ON `card_sets_cards`.`card_set_id` = 1 WHERE     `learnings`.`card_id` = `cards`.`id` AND `cards`.`id` = `card_sets_cards`.`card_id`

que está tan cerca de lo que estoy buscando, solo necesita agregar elcards tabla en la parte DE de la declaración.

Y ahí está mi pregunta: he revisado la fuente de Arel, y por mi vida no puedo encontrar la forma de agregar otra tabla.

Como nota al margen, ¿hay una mejor manera de ejecutar el resultado de Arel (que generalmente devuelve una Arel :: Relation, que no quiero) a través de ActiveRecord, aparte de representar a sql y ejecutar la consulta con find_by_sql como estoy ¿haciendo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta