使用连接表中的数据过滤多对多关系的结果

时间:2014-02-04 22:12:01

标签: ruby-on-rails ruby postgresql join model

我的rails应用程序有两个模型,StudentProfile和ClassProfile,它们通过连接表(模型注册)关联。

在我的ClassProfile模型中,我有:

has_many :enrollments
has_many :student_profiles, through: :enrollments

在我的StudentProfile模型中,我有:

has_one :enrollment
has_one :class_profile, through: :enrollment

我的注册表还有一个状态整数字段。

我想在名为“roster”的ClassProfile模型中添加一个方法,该方法返回注册状态为1的所有student_profiles。现在,我有以下内容:

def roster
  self.student_profiles
end

毋庸置疑,无论入学状况如何,所有这一切都归功于班上的所有学生。我觉得这应该很简单,但我没有看到如何在连接表(注册表)上添加过滤的示例。这是我可以在ClassProfile模型中完成的事情,还是我需要在注册(或其他地方)中做某事?

更新

通过查看@QMFNP提到的查询引用,这里是有效的代码:

self.student_profiles.includes(:enrollment).where('enrollments.status = ?', 1)

需要将:enrollments更改为:enrollment,因为它是has_one关联。我正在过滤的enrollments字段为status,因此将enrollments.id更改为enrollments.status

谢谢!

1 个答案:

答案 0 :(得分:1)

这可以通过在关联上指定查询条件来实现,如下所示:

def roster
  self.student_profiles.includes(:enrollment).where('enrollments.status = ?', 1)
end

这应该会返回您的预期结果。有关查询Active Record关联的更多信息,请访问:

http://guides.rubyonrails.org/active_record_querying.html

希望有所帮助!