2013-01-16 190 views
0

我正在使用Rails 3.2.9並試圖將categories表的所有結果返回到由連接上的department_id過濾的incomes表的任何匹配結果。 SQL查詢相當簡單:Rails-將條件加入包含

SELECT * FROM categories LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND dept_id = 86 

現在我已經能夠實現與joins所期望的結果:

Category.joins('LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND incomes.dept_id = 86') 

但我不知道爲什麼我不能得到這個與include一起工作。下面是我的模型:

類別

class Category < ActiveRecord::Base 
    attr_accessible :cat_code, :cat_ds 
    has_many :incomes, :conditions => ['dept_id = ?', 86]     
end 

收入

class Income < ActiveRecord::Base 
    attr_accessible :category_id, :year_id,:dept_id, :note 
    belongs_to :category 
end 

我已嘗試許多不同的方法能夠得到想要的結果,但我會說明我的最新嘗試,與上述模型。

@cat_inc = Category.find(:all, :include => [:incomes]) 

但試圖debug(@cat_inc)

我很困惑,爲什麼上面沒有產生上述SQL語句時,我得到一個undefined method each for nil:NilClass。有任何想法嗎?

編輯 也許更好的方式來說明這一點,我怎麼能有一個連接條件?像上面的SQL語句有:AND dept_id = 86

我能得到的最接近的是:

Category.includes(:incomes).where("incomes.dept_id = ?", 86) 

這給了我LEFT OUTER JOIN,但在連接後執行的條件AND dept_id = 86

SELECT "categories"."id" AS t0_r0, "categories"."cat_code" AS t0_r1, "categories"."cat_ds" AS t0_r2, "incomes"."id" AS t1_r0, "incomes"."category_id" AS t1_r1, "incomes"."year_id" AS t1_r2, "incomes"."chart_id" AS t1_r3, "incomes"."dept_id" AS t1_r4, "incomes"."note" AS t1_r5, "incomes"."jan" AS t1_r6, "incomes"."feb" AS t1_r7, "incomes"."created_at" AS t1_r8, "incomes"."updated_at" AS t1_r9 FROM "categories" LEFT OUTER JOIN "incomes" ON "incomes"."category_id" = "categories"."id" WHERE (incomes.dept_id = 86) 
+0

您應該立即將您的應用升級到** 3.2.11 **。這些更新只包含多個**非常關鍵的安全修復程序**。 http://weblog.rubyonrails.org/ – deefour

+0

@ Deefour-謝謝你!我意識到這個漏洞,但這只是一個現在的測試應用程序。雖然我很欣賞這個問題。 – groc426

+0

'.joins'和'.include'是兩個完全不同的東西。你遇到的問題是什麼? – deefour

回答

0

我想的has_many應該有一流的變複數詞。查看Rails Guide

+0

謝謝阿南德抓住我的錯誤。不幸的是,它修復後仍然會產生相同的錯誤。 – groc426

+0

請更新問題。 –

+0

已更新。希望這使得它更清晰。 – groc426