我有两个表格加入与参加表-这只是伪码:

Library
Book
LibraryBooks

我需要做的是如果我有的标识图书馆的,我想要得到的所有库,所有的书籍,该图书馆。

所以如果我有库1和图书馆书1有A和B,以及书籍A和B在库1、2和3,有一个优雅的(一线)的方式todo这在轨?

我在想:

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 } 在红宝石的1.8.6,快1.9.0.

我还要提到的是如果您使用 :joins 而不是的 include 有时,它会发现的图书馆和相关的图书都在同样的查询,加快了数据库的时间。 :joins 只会的工作,但是如果一个图书馆书籍。

其他提示

也许是:

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

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

如果你想要它全部在一个平面阵列。

当然,你真的应该界定这一方法上的图书馆,以维护的崇高事业的封装。

如果你想要一个一维系列图书馆回来了,重复删除。

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

一个问题

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

是,它将产生一个SQL呼吁每本书都在l.一个更好的方法(假设我明白了您的方案)可能是:

LibraryBook.find(:all, :conditions => ['book_id IN (?)', l.book_ids]).map(&:library_id).uniq
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top