문제

조인 테이블로 두 개의 테이블을 조인했습니다. 이것은 단지 의사 코드일 뿐입니다.

Library
Book
LibraryBooks

내가 해야 할 일은 내가 도서관의 ID를 갖고 있다면 이 도서관에 있는 모든 책이 들어 있는 모든 도서관을 가져오고 싶은 것입니다.

따라서 라이브러리 1이 있고 라이브러리 1에 책 A와 B가 있고 책 A와 B가 라이브러리 1, 2, 3에 있는 경우 레일에서 이를 수행할 수 있는 우아한(한 줄) 방법이 있습니까?

나는 생각하고 있었다:

l = Library.find(1)
allLibraries = l.books.libraries

그러나 그것은 작동하지 않는 것 같습니다.제안?

도움이 되었습니까?

해결책

l = Library.find(:all, :include => :books)
l.books.map { |b| b.library_ids }.flatten.uniq

참고하세요 map(&:library_ids) 보다 느립니다 map { |b| b.library_ids } Ruby 1.8.6에서는 더 빠르고 1.9.0에서는 더 빠릅니다.

나는 또한 당신이 사용했다면 언급해야 :joins 대신에 include 거기에서 동일한 쿼리로 도서관과 관련 서적을 모두 찾아 데이터베이스 시간을 단축할 수 있습니다. :joins 그러나 도서관에 책이 있는 경우에만 작동합니다.

다른 팁

아마도:

l.books.map {|b| b.libraries}

또는

l.books.map {|b| b.libraries}.flatten.uniq

모든 것을 평면 배열로 원한다면.

물론 캡슐화의 고귀한 원인을 유지하려면 이를 라이브러리의 메서드로 정의해야 합니다.

중복 항목이 제거된 라이브러리의 1차원 배열을 반환하려는 경우.

l.books.map{|b| b.libraries}.flatten.uniq

한 가지 문제

l.books.map{|b| b.libraries}.flatten.uniq

l의 각 책에 대해 하나의 SQL 호출을 생성한다는 것입니다.더 나은 접근 방식(귀하의 스키마를 이해한다고 가정)은 다음과 같습니다.

LibraryBook.find(:all, :conditions => ['book_id IN (?)', l.book_ids]).map(&:library_id).uniq
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top