0

仅当某个条件为真时,我如何使用联接?例如,我有这个查询:

@courses = Course.find(:all,
    :order=> 'courses.name asc',
    :include => [:units],
    :joins => :course_sub_responsibles,
    :group => 'courses.name',
    :conditions => conditions) 

但我只需要在特定条件下加入 course_sub_responsibles 表。

4

2 回答 2

2

您应该使用基于 ARel 的方法:

@courses = Course.scoped  # Course.all in rails 4
@courses = @courses.order("courses.name asc").includes(:units)
@courses = @courses.joins(:course_sub_responsibles) if YOUR_CONDITION
@courses = @courses.group("courses.name")
@courses = @courses.where(conditions)
@courses

这只会在迭代变量时执行查询,但查询将由片段构建,因此您可以在需要时添加/删除片段。

在 Rails4 中它会更干净(注意刘海,这意味着像往常一样“修改接收器”):

@courses = Course.all
@courses.order!("courses.name asc")
@courses.includes!(:units)
@courses.joins!(:course_sub_responsibles) if YOUR_CONDITION
@courses.group!("courses.name")
@courses.where!(conditions)
@courses
于 2012-10-14T13:12:07.767 回答
0

ActiveRecord.find方法将Hash 作为最后一个参数(没有花括号,但它确实是一个哈希),这意味着您可以这样做:

options = { :order=> 'courses.name asc',
:include => [:units],
:group => 'courses.name',
:conditions => conditions }

options[:join] = :course_sub_responsibles if YOUR CONDITION GOES HERE

@courses = Course.find(:all, options)
于 2012-10-14T15:15:20.913 回答