Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何检查模型在Rails中是否存在模型关联?_Ruby_Ruby On Rails 3 - Fatal编程技术网

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

Ruby 如何检查模型在Rails中是否存在模型关联?,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我有两个关联的ActiveRecord模型(Book、Ad)。在我的查询中,我想获取有1个或多个广告的书籍。最好的方法是什么 # 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 mo

我有两个关联的ActiveRecord模型(Book、Ad)。在我的查询中,我想获取有1个或多个广告的书籍。最好的方法是什么

# 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
控制器中的
#
@书=书。在哪里(书有一个或多个广告)。最后(20)
#图书型号:
类目:destroy
...
结束
#广告模式:
类Ad
一个选项是使用
连接

Book.joins(:ads)

joins
允许您在一个查询中完成所有这一切,这将为您提供所有设置了
Ad
上的
book\u id
book

因此,对于控制器,您需要:


@books=Book.joins(:ads)。最后(20)

一个选项是使用
joins

Book.joins(:ads)

joins
允许您在一个查询中完成所有这一切,这将为您提供所有设置了
Ad
上的
book\u id
book

因此,对于控制器,您需要:

@books=Book.joins(:ads).在控制器中的最后(20)

subquery = Ad.select("book_id").group(:book_id).having("COUNT(*) >= 1").to_sql
@books =   Book.where("id IN (#{subquery})").last(20)
在控制器中

subquery = Ad.select("book_id").group(:book_id).having("COUNT(*) >= 1").to_sql
@books =   Book.where("id IN (#{subquery})").last(20)

另一个简单的解决办法是

Ad.all.map{|ad| ad.book}.uniq.last(20)

这将返回
数组中最后20个唯一的图书
,因为如果
广告
存在,那么它就有一本
图书
,因此该图书有一个或多个
广告

另一个简单的解决方案是

Ad.all.map{|ad| ad.book}.uniq.last(20)

这将返回
数组中最后20个唯一的书籍
,因为如果
广告
存在,则它有一本
书籍
,因此该书籍有一个或多个
广告

没有问题。如果这有帮助,请单击答案旁边的绿色复选标记关闭此问题。没问题。如果这有帮助,请单击答案旁边的绿色复选标记以结束此问题。只需简短的旁注,您不需要像那样分隔子查询。您可以简单地执行
Book.where(id=>Ad.select(“Book\u id”).group(:Book\u id)。having(“COUNT(*)>=1”)
,子查询将以相同的方式在
where
子句中执行。只需简单的旁注,您不需要像那样分隔子查询。您只需执行
Book.where(id=>Ad.select(“Book\u id”).group(:Book\u id)。having(“COUNT(*)>=1”)
,子查询将以相同的方式在
where
子句中执行。