2

そのため、Railsはhabtm関係を介した:throughアソシエーションをサポートしていません。Rails 2.xにこれを追加するプラグインがありますが、私はRails 3 / Edgeを使用しており、特定の1つのモデルの関連付けのみが必要です。だから、アレルという美しさで自分で切り刻むと思いました。

まず、モデル:

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

特定のカードセット、:through=>カードに属するすべての学習を取得したいと思います。

これは、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

それは私に与えます(くそー、アレルは美しいです!):

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`

これは私が目指しているものに非常に近いです-cardsステートメントのFROM部分のテーブルに追加する必要があります。

そして、私の質問があります:私はArelソースを調べました、そして私の人生の間、私は別のテーブルに追加する方法を理解することができません。

補足として、SQLにレンダリングしてfind_by_sqlを使用してクエリを実行する以外に、ActiveRecordを介してArel(通常はArel :: Relationshipを返します)から結果を実行するためのより良い方法はありますか?やってる?

4

2 に答える 2

0

私はアレルに精通していませんが、それは処理しません:

l.includes(:card)
于 2010-10-05T20:30:14.283 に答える
0

RailsがArelをカプセル化する方法を学んだ後、これは上記で書いたものよりも簡単なので、クエリを直接作成する必要はありません。

CardSetモデルでネストされたhabtmをスタブ化しようとしている場合、別名:

has_many :learnings, :through => :cards

次に、これを使用して動作をシミュレートできます。

class CardSet < ActiveRecord::Base

  has_and_belongs_to_many :cards, :uniq => true

  def learnings
    Learning.joins(:card).where(:cards => { :id => self.card_ids })
  end
end

次に、次のようなクエリが機能します。

CardSet.first.learnings
于 2010-10-06T21:38:59.077 に答える