Ruby/Rails Collection to Collection

前端 未结 4 1647
天涯浪人
天涯浪人 2021-02-09 23:04

I have a two tables joined with a join table - this is just pseudo code:

Library
Book
LibraryBooks

What I need to do is if i have the id of a l

相关标签:
4条回答
  • 2021-02-09 23:05
    l = Library.find(:all, :include => :books)
    l.books.map { |b| b.library_ids }.flatten.uniq
    

    Note that map(&:library_ids) is slower than map { |b| b.library_ids } in Ruby 1.8.6, and faster in 1.9.0.

    I should also mention that if you used :joins instead of include there, it would find the library and related books all in the same query speeding up the database time. :joins will only work however if a library has books.

    0 讨论(0)
  • 2021-02-09 23:05

    Perhaps:

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

    or

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

    if you want it all in a flat array.

    Of course, you should really define this as a method on Library, so as to uphold the noble cause of encapsulation.

    0 讨论(0)
  • 2021-02-09 23:21

    If you want a one-dimensional array of libraries returned, with duplicates removed.

    l.books.map{|b| b.libraries}.flatten.uniq
    
    0 讨论(0)
  • 2021-02-09 23:21

    One problem with

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

    is that it will generate one SQL call for each book in l. A better approach (assuming I understand your schema) might be:

    LibraryBook.find(:all, :conditions => ['book_id IN (?)', l.book_ids]).map(&:library_id).uniq
    
    0 讨论(0)
提交回复
热议问题