Как запретить ActiveRecord помещать пространство имен модели в столбец 'type' с полиморфизмом - PullRequest
0 голосов
/ 25 октября 2011

У меня есть приложение ruby, использующее ActiveRecord.У меня есть следующие модели

module ExchangeManager
  module Resources
    class Composition < ActiveRecord::Base
      belongs_to :chain
      belongs_to :link, :polymorphic => true, :primary_key => :id
    end

    class Chain < ActiveRecord::Base
      has_many :compositions
    end
  end
end

со следующей миграцией

create_table :compositions do |t|
  t.references :link, :polymorphic => true
end

create_table :chains do |t|
  t.string :name, :null => false
end

Когда я создаю новую цепочку с 2 связанными композициями, таблица «составы» таблицы SQL содержит:

id |link_id |link_type

1 |1 |ExchangeManager :: Resources :: Цепочка

2 |1 |ExchangeManager :: Resources :: Chain

Вместо того, чтобы иметь полное пространство имен в столбце link_type, я бы хотел, чтобы ActiveRecord сохранял только короткое имя класса, то есть 'Chain' вместо 'ExchangeManager :: Resources :: Chain'.

Почему?Потому что я использую ту же БД в другом приложении Rails, и я хотел бы иметь возможность манипулировать теми же моделями в этом проекте без пространств имен.

1 Ответ

3 голосов
/ 25 октября 2011

Это потребует, я полагаю, некоторого исправления механизма полиморфной загрузки. И я бы советовал против этого.

Лучшим решением было бы иметь собственный столбец , в котором хранится тип без пространства имен.

class FirstModel
  before_save :store_link_type
  def store_link_type
    self.link_short_type = self.link && self.link.class.name.split(':').last # or whatever
    return true
  end
end

class SecondModel
  belongs_to :link, :polymorphic => true, :foreign_type => 'link_short_type'
end

Если вы хотите обновить ссылку и во втором приложении, вам также придется выполнить обратную операцию, предварительно добавив пространство имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...