Как в Ruby on Rails связать полиморфную модель с моделью пространства имен? - PullRequest
4 голосов
/ 22 октября 2008

У меня есть следующие модели.

# 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::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"

Однако, похоже, это тоже не работает.

Итак, есть ли лучший способ сделать это? Или это не поддерживается?

Ответы [ 2 ]

5 голосов
/ 24 октября 2008

Чтобы это исправить, я сделал include Domain в модели DomainObject и установил ActiveRecord::Base.store_full_sti_class = true в config/environment.rb.

1 голос
/ 15 мая 2016

Hoyhoy ответ является решением. Это решило и мою проблему (я действительно хотел, чтобы пространство имен было удалено).

Тем не менее, я бы рекомендовал добавить x.store_full_sti_class = true к config/environment.rb, только если это необходимо в глобальном масштабе. Я полагаю, что это не всегда требуется, и в этом случае мы можем легко перевести решение на уровень класса.

class User < ActiveRecord::Base
  self.store_full_sti_class = true
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...