2008-10-22 47 views
4

我有以下型號。在Ruby on Rails中,如何使多態模型與名稱空間模型相關聯?

# app/models/domain/domain_object.rb 
class Domain::DomainObject < ActiveRecord::Base 
    has_many :links_from, :class_name => "Link", :as => :from, :dependent => :destroy 
end 

# app/models/link.rb 
class Link < ActiveRecord::Base 
    belongs_to :from, :polymorphic => true 
    belongs_to :object_value, :polymorphic => true 
end 

問題是,當我執行以下操作時,from_type不會將Domain名稱空間作爲模型的前綴,例如,

Domain::DomainObject.all(:include=> :links_from) 

這導致下面的SELECT:

SELECT `links`.* FROM `links` WHERE (`links`.`from_id` IN (5,6,12,13,18,24,25,27,29,30,31,32,34,35,39) and `links`.`from_type` = 'DomainObject') 

查詢應該是:

SELECT `links`.* FROM `links` WHERE (`links`.`from_id` IN (5,6,12,13,18,24,25,27,29,30,31,32,34,35,39) and `links`.`from_type` = 'Domain::DomainObject') 

由於Rails自動保存與命名空間模型。

我見過on Rails的網站的幾個建議這樣做這樣的事情:

belongs_to :from, :polymorphic => true, :class_name => "Domain::DomainObject" 

然而,這似乎並沒有擦出火花。

那麼,有沒有更好的方法來做到這一點?或者這不被支持?

回答

5

爲了解決這個問題,我在DomainObject模型做了include Domainconfig/environment.rb設置ActiveRecord::Base.store_full_sti_class = true

1

hoyhoy的回答是解決方案。這也解決了我的問題(我真的希望命名空間被剝離)。

但是,我建議x.store_full_sti_class = true被添加到config/environment.rb,只要它是全球性的。我想可能並不總是需要,在這種情況下,我們可以很容易地將解決方案轉化爲課堂級別。

class User < ActiveRecord::Base 
    self.store_full_sti_class = true 
    ... 
end