6

結合テーブルで結合された 2 つのテーブルがあります。これは単なる擬似コードです。

Library
Book
LibraryBooks

私がする必要があるのは、図書館のIDを持っている場合、この図書館が持っているすべての本が入っているすべての図書館を取得したい.

ライブラリ 1 があり、ライブラリ 1 に本 A と B があり、本 A と B がライブラリ 1、2、3 にある場合、レールでこれを行うエレガントな (1 行の) 方法はありますか?

私が考えていた:

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

しかし、それはうまくいかないようです。提案?

4

4 に答える 4

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

map(&:library_ids)は Ruby 1.8.6よりも遅くmap { |b| b.library_ids }、1.9.0 では高速であることに注意してください。

:joinsそこの代わりに使用するincludeと、図書館と関連書籍がすべて同じクエリで検索され、データベース時間が短縮されることにも言及する必要があります。:joinsただし、図書館に本がある場合にのみ機能します。

于 2008-09-17T10:18:44.753 に答える
3

多分:

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

また

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

すべてをフラットな配列にしたい場合。

もちろん、これを Library のメソッドとして実際に定義して、カプセル化の崇高な目的を維持する必要があります。

于 2008-09-17T03:26:40.407 に答える
2

1つの問題

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

l の本ごとに 1 つの SQL 呼び出しを生成するということです。より良いアプローチ (スキーマを理解していると仮定) は次のようになります。

LibraryBook.find(:all, :conditions => ['book_id IN (?)', l.book_ids]).map(&:library_id).uniq
于 2008-09-17T08:59:40.340 に答える
2

重複を削除してライブラリの 1 次元配列を返したい場合。

l.books.map{|b| b.libraries}.flatten.uniq
于 2008-09-17T03:48:53.567 に答える