在ActiveRecord中向Rails“include”添加“where”子句

时间:2013-03-04 17:24:17

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

  • 用户拥有多个网站
  • 网站有许多控制器
  • 控制器有许多检查

这就是我现在所拥有的。

current_user
   .sites
   .joins(:controllers)
   .where('controllers.inspections_enabled = true')
   .all(:include => [:controllers => [:inspections]])

这给了我:

“启用控制器的所有站点,包括所有控制器和检查”

我想要

“启用控制器的所有站点,并且仅包含'inspections_enabled = true'的控制器,以及所有子检查”

先谢谢

1 个答案:

答案 0 :(得分:3)

您应该定义一个已定义条件的关联,请参阅docs

  

如果您确实希望只加载一个关联的某些成员   通常更自然地包括具有条件的关联   在它上面定义。

在你的情况下:

class Site < ActiveRecord::Base
  has_many :inspections_enabled_controllers, 
           :class_name => 'Controller', 
           :conditions => ['inspections_enabled = ?', true]
end

current_user
    .sites
    .joins(:inspections_enabled_controllers)
    .all(:include => [:inspections])