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