2012-08-06 65 views
1

我一直在研究一個大量使用模型關聯的項目,而且似乎我發現has_many或has_one through功能與條件功能衝突的情況。簡而言之,問題在於,通過關聯爲has_one though關係中的中間表創建表別名。但我不知道如何使該表的別名出現在我已經defined.If那是難走的情況,也許代碼會有所幫助:如何通過關係使Rails has_many與has_many條件一起工作?

class Event < ActiveRecord::Base 
    has_one :event_intake, :conditions => ['event_intakes.is_draft = 1'] 
    has_many :product_instances, :through => :event_intake 
end 

class EventIntake < ActiveRecord::Base 
    belongs_to :event 
    has_many :product_instances, :conditions => ['is_deleted = ?', '0'] 
end 

class ProductInstance < ActiveRecord::Base 
    belongs_to :event_intake 
end 

這裏的MySQL查詢和錯誤我得到:

Mysql2::Error: Unknown column 'event_intakes.is_draft' in 'on clause': 

SELECT DISTINCT `events`.id FROM `events` 
    LEFT OUTER JOIN `event_intakes` product_instances_events_join ON (`events`.`id` = `product_instances_events_join`.`event_id`) 
    LEFT OUTER JOIN `product_instances` ON (`product_instances`.`event_intake_id` = `product_instances_events_join`.`id`) AND event_intakes.is_draft = 1 
WHERE (product_instances.serial_number = '313') ORDER BY events.id DESC LIMIT 0, 50 

直通關聯將event_intakes表別名爲「product_instances_events_join」。但情況event_intakes.is_draft中的表格沒有更改以匹配它。

我使用的是rails 2.3.11,但我認爲這個問題可能同樣適用於rails 3.我讀過through關聯應該只用於has_many,而不是has_one,但我不認爲這是這個問題的原因。

如果我只是將條件更改爲「product_instances_events_join.is_draft = 1」,它將解決此特定情況的問題,但在沒有表別名時將其解決。 如果我可以在has_one條件中使用字符串插值來獲取正確的表名,那將會很好。這樣的事情: has_one:event_intake,:conditions => [「#{EventIntake.table_name} .is_draft = 1」] 我不認爲上面的代碼會工作,因爲EventIntake的table_name在別名發生時不會改變。

另一件事我已經試過這樣的事情隨即發生了混疊之前重新定義上飛的has_many關聯之前我做了查詢: Event.has_one:event_intake,:條件=> ['product_instances_events_join.is_draft = 1'] 相信與否,這實際上解決了webrick中的問題,但我很猶豫在多線程乘客環境中使用這種方法,因爲我認爲這等於修改了一個可能影響其他線程的全局變量。此外,這是一個黑客。

有沒有人有任何建議如何解決這個問題?任何幫助將非常感激。

+0

什麼,沒人知道?誰可以回答這個問題就可以獲得免費糖果 – jsarma 2012-08-11 22:01:53

回答

1

你可以把條件上:product_instances

class Event < ActiveRecord::Base 
    has_one :event_intake 
    has_many :product_instances, :through => :event_intake, 
       :conditions => ['event_intakes.is_draft = 1'] 
end 

具有在HAS_ONE的情況似乎有點尷尬,因爲你真的不過濾event_intakes但打開或關閉,而打開整個關聯。但我想這在這裏沒有意義。

另外,我明白,如果你有幾個後續'通過'的關聯,你想過濾中介的條件,那麼這不是非常乾燥。這就是我發現自己的地方,這就是我在這裏偶然發現的。