Simulieren von has_and_belongs_to_many, die durch das Verhalten in Rails 3 @ verschachtelt si

So Rails hat keine Unterstützung für: durch Assoziationen durch eine gewohnte Beziehung. Es gibt Plugins, die dies für Rails 2.x hinzufügen, aber ich verwende Rails 3 / Edge und benötige nur die Zuordnung für ein bestimmtes Modell. Also dachte ich, ich würde mich mit der Schönheit, die Arel ist, abfinden.

Zunächst die Modelle:

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

Ich möchte alle Erkenntnisse erhalten, die zu einem bestimmten Kartensatz gehören: durch => Karten.

Das habe ich bisher in meinem CardSet-Modell:

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

was gibt mir (verdammt, Arel ist schön!):

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`

Das ist ach so nah an dem, was ich anstrebe - muss nur im @ hinzufügcards -Tabelle im FROM-Teil der Anweisung.

Und da ist meine Frage: Ich habe die Arel-Quelle durchgesehen und für mein ganzes Leben kann ich nicht herausfinden, wie ich sie in eine andere Tabelle einfügen soll.

Als Nebenbemerkung gibt es eine bessere Möglichkeit, das Ergebnis von Arel (das normalerweise eine Arel :: Relation zurückgibt, die ich nicht möchte) über ActiveRecord auszuführen, als in SQL zu rendern und die Abfrage mit find_by_sql auszuführen, wie ich ' Ich tue

Antworten auf die Frage(4)

Ihre Antwort auf die Frage