我有两个关联的ActiveRecord模型(Book,Ad)。在我的查询中,我想要获取有一个或多个广告的图书。最好的方法是什么?
# in controller:
@books = Book.where(book has got 1 or more ads).last(20)
# Book model:
class Book < ActiveRecord::Base
has_many :ads, :dependent => :destroy
...
end
# Ad model:
class Ad < ActiveRecord::Base
belongs_to :book
...
end
答案 0 :(得分:3)
一种选择是使用joins
:
Book.joins(:ads)
joins
允许您在一个查询中执行所有这些操作,这将为您提供Books
设置book_id
的所有Ad
。
因此,对于您的控制器,您必须:
@books = Book.joins(:ads).last(20)
答案 1 :(得分:1)
subquery = Ad.select("book_id").group(:book_id).having("COUNT(*) >= 1").to_sql
@books = Book.where("id IN (#{subquery})").last(20)
答案 2 :(得分:0)
另一个简单的解决方案是
Ad.all.map{|ad| ad.book}.uniq.last(20)
这将返回Array
中的最后20本独特图书,因为如果Ad
存在,那么它会有Book
,因此图书有1个或更多Ads