题
我有两个表格加入与参加表-这只是伪码:
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
不隶属于 StackOverflow