Ruby / Rails集合到集合

我有一个连接表连接的两个表 – 这只是伪代码:

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中的map { |b| b.library_ids } ,1.9.0中更快。

我还应该提一下,如果您使用:joins而不是include ,那么它会在相同的查询中找到库和相关书籍,从而加快数据库时间。 :joins只有图书馆有书籍时才能使用:joins

也许:

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

要么

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

如果你想要一个平面arrays。

当然,您应该将其定义为库中的一种方法,以维护封装的崇高原因。

如果要返回一维库的数组,则删除重复项。

 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