如何搜索模型,但仅限于至少有一个子关联?

时间:2017-01-29 18:59:07

标签: ruby-on-rails postgresql search associations ruby-on-rails-5

我的Ruby on Rails 5(PostGres 9.5)应用程序中有两个模型。我有

class Machine < ActiveRecord::Base
  has_many :parts

class Part < ActiveRecord::Base
  belongs_to :machine

我想搜索Machine对象,所以我有

  @results = Machine.where("name ILIKE ?", "%#{machine_name}%")
                 .order("LOWER(name)")  
                 .paginate(:page => params[:page])

但需要注意的是,我只想返回至少有一个与之关联的Part对象的对象。我意识到我做了

  @results = Machine.joins(:parts)
                 .where("name ILIKE ?", "%#{machine_name}%")
                 .order("LOWER(name)")  
                 .paginate(:page => params[:page])

但我认为这是非常低效的,因为有成千上万的关联。搜索我的Machine对象的最有效方法是什么,但前提是它们至少有一个Part关联?

1 个答案:

答案 0 :(得分:0)

<强>更新

经过一番搜索后,可以通过

轻松完成
Machine.joins(:parts)
 .where('some condition')
 .group(:id)
 .having("count('parts.*') > 0")