【问题标题】:Get all child models from a model without looping?从模型中获取所有子模型而不循环?
【发布时间】:2015-10-15 17:54:00
【问题描述】:

我有 2 个模型:

class Books < ActiveRecord::Base
  has_many :library_books
  has_many :libraries, through: :library_books
end

class Library < ActiveRecord::Base
  has_many :library_books
  has_many :books, through: :library_books
end

我运行的查询类似于:

books = Book.joins(:libraries).where("title LIKE ?", "%somevalue%")

此查询有效,并从所有图书馆获取特定标题的所有书籍。但是,我正在尝试从我拥有的书籍列表中获取所有图书馆。如果我这样做,我可以获得每个图书馆:

books.each do |b|
  libraries = b.libraries

  # Do something with the libraries
end

但是,必须有一种更简单的方法来做到这一点,而无需遍历每本书。我如何获得所有图书馆而不必遍历每本书以将它们放入查询中(并删除可能出现的任何重复图书馆)?有可能吗?

一如既往,提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rails-activerecord


    【解决方案1】:

    试试:

    libraries = Book.where("title LIKE ?", "%somevalue%").preload(:libraries).flat_map(&:libraries)
    

    甚至更好:

    libraries = Library.joins(:books).where("books.title LIKE ?", "%somevalue%").uniq
    

    如果您需要书籍和图书馆:

    books = Book.where("title LIKE ?", "%somevalue%").preload(:libraries)
    libraries = books.flat_map(:libraries).uniq
    

    【讨论】:

    • 谢谢!第一个查询效果很好。这是否检查唯一性?原谅我的无知,我是 Ruby 和 Rails 的新手。
    • @Sean - 嗨,如果libraries 是多对多关联,第一个查询可能会有一些重复。第二个查询是保存,但它也更干净。
    • 嗯,我需要来自书籍和图书馆的数据。但我需要所有书籍和所有图书馆(但只有独特的图书馆)。有没有办法使用您提供的类似查询来完成这两者?
    • 回答了我自己的问题。在库末尾添加“uniq”也确实实现了独特性。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多