Rails - 仅在条件为真时才使用join

时间:2012-10-14 13:06:45

标签: ruby-on-rails

如果某个条件为真,我该如何使用连接? 例如,我有这个查询:

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

但我只需要在某种情况下加入course_sub_responsibles表。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)