我有以下型号。
# 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会自动使用命名空间保存模型。
我在Rails网站上看到过一些关于这样做的建议:
belongs_to :from, :polymorphic => true, :class_name => "Domain::DomainObject"
然而,这似乎也不起作用。
那么,有更好的方法吗?或者这不受支持吗?
答案 0 :(得分:5)
要解决此问题,我在include Domain
模型中执行了DomainObject
,并在ActiveRecord::Base.store_full_sti_class = true
中设置了config/environment.rb
。
答案 1 :(得分:1)
但是,我建议将x.store_full_sti_class = true
添加到config/environment.rb
,仅在全球需要时添加class User < ActiveRecord::Base
self.store_full_sti_class = true
...
end
。我想可能并不总是需要它,在这种情况下,我们可以轻松地将解决方案转换为类级别。
Right(Sheet1.Cells(i, 9), 1).Font.ColorIndex = 3