그래서 레일스는 : habtm 관계를 통한 연결을 지원하지 않습니다. 거기에 레일스 2.x에서 이것을 추가 할 플러그인이 있지만 레일즈 3/에지를 사용하고 특정 모델에 대한 연관 만 필요합니다. 그래서 저는 Arel이라는 아름다움으로 나 자신을 그루터기를 털썩 내 렸습니다.레일스 3에서 has_and_belongs_to_many 중첩 된 동작 시뮬레이션
첫째, 모델 :
나는 특정 카드 세트에 속하는 모든 교훈을 얻고 싶은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
=> 카드를 통해. 저를 (! 빌어 먹을, Arel이 아름답다) 제공
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
:
이
내가 내 CardSet 모델에서 지금까지 무엇을 가지고 오에 가까운입니다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`
내가 목표로한다면 명세서의 FROM 부분에있는 cards
테이블을 추가하기 만하면됩니다.
그리고 내 질문이 있습니다. 저는 Arel 소스를 살펴 보았습니다. 그리고 내 인생에서 나는 다른 테이블을 추가하는 방법을 알 수 없습니다.
sidenote로, Arel (일반적으로 Arel :: Relation을 반환하는)에서 결과를 실행하는 더 좋은 방법이 있습니까? ActiveRecord를 통해, sql로 렌더링하고 find_by_sql 내가하고있는 것처럼?
그와 관련된 카드와 관련된 것보다는 모든 학습을 끌어 올 것입니다. card_set (a.k.a., 중첩 된 habtm). – bouchard