我一直在研究一個大量使用模型關聯的項目,而且似乎我發現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中的問題,但我很猶豫在多線程乘客環境中使用這種方法,因爲我認爲這等於修改了一個可能影響其他線程的全局變量。此外,這是一個黑客。
有沒有人有任何建議如何解決這個問題?任何幫助將非常感激。
什麼,沒人知道?誰可以回答這個問題就可以獲得免費糖果 – jsarma 2012-08-11 22:01:53