Rails: Polymorphic User Table - хорошая идея с AuthLogic? - PullRequest
1 голос
/ 26 мая 2010

У меня есть система, в которой мне нужно войти в систему трех типов пользователей: клиенты, компании и поставщики из одной формы входа на домашней странице.

Я создал одну таблицу User, которая работает в соответствии с примером приложения AuthLogic, по адресу http://github.com/binarylogic/authlogic_example. Я добавил поле с именем «Тип пользователя», которое в настоящее время содержит «Клиент», «Компания» или «Продавец».

Примечание: каждый тип пользователя содержит много разрозненных полей, поэтому я не уверен, является ли лучшим способом наследования отдельных таблиц (приветствуются исправления, если этот вывод неверен).

Является ли это полиморфной ассоциацией, где каждый из трех типов «помечен» пользовательской записью? Как должны выглядеть мои модели, чтобы у меня были правильные отношения между таблицей пользователей и типами пользователей: клиент, компания, поставщик?

Большое спасибо!

------ UPDATE ------

Текущая настройка:

#User model
class User < ActiveRecord::Base
  acts_as_authentic
  belongs_to :authenticable, :polymorphic => true
end

#Customer model (Company and Vendor models are similar)
class Customer < ActiveRecord::Base
  has_many :users, :as => :authenticable
  acts_as_authentic
end

Это правильный способ их настройки?

1 Ответ

0 голосов
/ 26 мая 2010

Это звучит так, как будто вы пытаетесь сделать:

У вас есть users, который может быть одним из трех groups. Если это не совсем правильно, поможет небольшое разъяснение.

Поскольку AuthLogic заботится только о своих специальных полях, создание и использование других полей в вашей пользовательской модели не так уж сложно.

Каждый user может быть составлен примерно так:

#The Authlogic Fields
t.string :username,          :null => false
t.string :crypted_password,  :null => false
t.string :password_salt,     :null => false
t.string :persistence_token, :null => false

#Your field to identify user type
t.integer :user_type

#If your user is a customer, you would populate these fields
t.integer :customer_name
...

#If your user is a company, you would populate these fields
t.integer :company_name
...

#If your user is a vendor, you would populate these fields
t.integer :vendor_name
...

Я не уверен, что вы подразумеваете под "наследованием одной таблицы", но если вы хотите сохранить информацию о vendor в таблице отдельно от таблицы пользователей (на самом деле нет причин, если вы ДЕЙСТВИТЕЛЬНО не обеспокоены производительностью) Вы можете просто связать свои модели так:

class User < ActiveRecord::Base
  has_many :customers, :companies, :vendors
end

class Customer < ActiveRecord::Base
  belongs_to :user
end

class Company < ActiveRecord::Base
  belongs_to :user
end

class Vendor < ActiveRecord::Base
  belongs_to :user
end

В этом случае, поскольку у пользователя не будет ассоциаций с 2 ​​из 3 типов пользователей, вы вынуждены использовать ассоциацию has_many, которая прекрасно работает со случаем ассоциации 0. Вам просто нужно сделать несколько проверок в своем коде, чтобы убедиться, что вы не удвоитесь.

...