2012-10-14 37 views
0

僅當特定條件成立時才如何使用連接? 例如,我有這個疑問:Rails - 僅在條件爲真時才使用連接

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

但我需要加入course_sub_responsibles表只在一定的條件下。

+0

的參數是一個哈希只會增加,如果你的條件符合的加入到哈希。 –

+0

將你的條件寫入一個散列並在滿足時添加連接條件,之後調用Course.find(hash) –

回答

0

ActiveRecord.find方法以一個散列作爲最後一個參數(這是不寫大括號,但它確實是一個哈希),這意味着你可以這樣做:

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) 
+0

謝謝。唯一的問題是它應該是:與's'連接。 –

+0

@saverio,你到底在說什麼?這與我提供的解決方案有什麼關係,爲什麼這被視爲downvote?你有更好的解決方案嗎?如果不是,那麼你不應該低估其他人的正確答案。 –

+0

有人刪除了我以前的評論。無論如何,我編輯你的答案,以更好地適合你可以傳遞散列作爲最後一個參數的實際原因(這是完全無關'* args' !!!)。編輯完成後,確定,響應是正確的(因爲OP可能使用Rails 2)。 Downvote刪除。 – rewritten

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 
+0

+1,甚至更好(並且更加精確) –

+0

我得到一個錯誤:No Method Error。這種方法是否適用於rails 1.8.7? –

+0

你不使用rails 3嗎? – rewritten

相關問題