如何检查模型是否在Rails中存在模型关联?

时间:2014-01-02 19:41:21

标签: ruby ruby-on-rails-3

我有两个关联的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

3 个答案:

答案 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