2013-04-04 72 views
3

好吧,所以這是我遇到的問題。我有一個模型在直通表中的條件中設置了兩個關係。ActiveRecord查詢與包含和條件不給予預期的SQL

has_one :link_resource, through: :resource_contexts, source: :resource, conditions: ['resource_contexts.question_id = ? ', -1] 
has_many :sample_plans, through: :resource_contexts, source: :resource, conditions: ['resource_contexts.question_id = ? ', -2] 

然後,在我的控制,我嘗試使用

@funder_templates = FunderTemplate.find(:all, include: [:sample_plans, :link_resource], conditions: {active: true}) 

但由於某些原因,SQL出來這樣

ResourceContext Load (0.2ms) SELECT `resource_contexts`.* FROM `resource_contexts` WHERE (`resource_contexts`.funder_template_id IN (2,3,4,5,6,7,8,9,10,11,12,13,14,20,21,22,23,24,25,26,27,30,40) AND (resource_contexts.question_id = -2)) 

注意到它的唯一希望得到這些包括對於第一關係的條件,而不是第二關係的條件。我不知道我在做什麼對於ActiveRecord來說太複雜了,或者我只是寫錯了。任何幫助,將不勝感激。

的Rails 3.0.20

的Ruby 1.9.2

編輯:爲了澄清,真的搞砸了部分是@ funder_templates.sample_plans是正確的,但@ funder_templates.link_resource是樣品計劃,以及!如果沒有包含,這些關係可以正常工作,但它並未得到優化。

+0

你寫的'包括:[:sample_plans,:link_resource]' - 這些都是關係。 – MikDiet 2013-04-04 21:22:06

+1

@Mik_Die這不是我寫的嗎? – JoshEmory 2013-04-04 21:30:12

+0

如果你想嘗試使用更新的語法......'@funder_templates = FunderTemplate.all.includes([:sample_plans,:link_resource])。其中(:active => true)' – depa 2013-04-04 21:48:24

回答

0

你試過了嗎? @funder_templates = FunderTemplate.where(活動:真).includes([:sample_plans,:link_resource])

我認爲,它應該工作

+0

您可能沒有看到我對depa的評論,但我確實嘗試過'@funder_templates = FunderTemplate.includes([:link_resource,:sample_plans])。where(active:true)'。當我看@ funder_templates.link_resource和@ funder_templates.sample_plans時,他們都會產生相同的結果,他們都是示例計劃。我最終走了一條不同的路線(效率相似),因爲我認爲這是一個活躍記錄中的錯誤。可能在我們正在使用的版本中(3.0.20)。 – JoshEmory 2013-05-06 15:27:35