Полиморфная ассоциация с использованием пространств имен - PullRequest
1 голос
/ 04 мая 2011

Я использую Ruby on Rails 3, и я хотел бы установить полиморфную ассоциацию, используя классы пространства имен.

Миграции :

create_table :users_users do |t|
  t.integer :id
  t.string :full_name
  t.references :userable, :polymorphic => true
end

create_table :users_profiles do |t|
  t.integer :id
  ...
end

create_table :users_accounts do |t|
  t.integer :id
  ...
end

Классы :

class Users::User < ActiveRecord::Base
  # Association ...
end

class Users::Profile < ActiveRecord::Base
  # Association ...
end

class Users::Account < ActiveRecord::Base
  # Association ...
end

Как я должен написать ассоциации кода для вышеуказанных классов (используя :class_name => "Users:User", ...?) , чтобы автоматически создавать и автоматически уничтожать связанных записей моделей, «отображать» их в таблице users_users и наоборот?

У вас есть какие-то советы по этому поводу?Какие строковые значения у меня будут в userable_type атрибутах (например: «Users :: Profile», «Profile», ...)?

1 Ответ

1 голос
/ 04 мая 2011

Чтобы настроить ассоциации, вам не нужно использовать имя класса ...

class Users::User < ActiveRecord::Base
  belongs_to :userable, :polymorphic => true
end

class Users::Profile < ActiveRecord::Base
  has_one :user, :as => :userable, :dependent => :destroy
end

class Users::Account < ActiveRecord::Base
  has_one :user, :as => :userable, :dependent => :destroy
end

:dependent => :destroy будет иметь дело с их удалением, когда Users :: User уничтожен, но с точки зрения создания у вас есть те же опции, что и с обычными отношениями. Если вы делаете это из формы, лучше использовать вложенные атрибуты.

В базе данных столбец userable_type будет содержать пространство имен. Так что это будут «Пользователи :: Аккаунт» или «Пользователи :: Профиль».

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