문제
조인 테이블로 두 개의 테이블을 조인했습니다. 이것은 단지 의사 코드일 뿐입니다.
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
제휴하지 않습니다 StackOverflow