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 に答える