Наследование модели - используйте «где» в зависимости от атрибута

У меня есть модель пользователя и модель дилера и клиента, которые наследуют класс пользователя и не имеют собственной таблицы базы данных:

class User < ActiveRecord::Base
end

class Dealer < User
  before_save :set_default_values

  def set_default_values
    self.role_id = Role.find_by_handle('dealer').id
  end
end

class Customer < User
    …
end

Я не использую области действия, потому что мне нужно что-то вроде дилерского_пути и некоторая пользовательская логика для каждой роли.

Теперь мне интересно, как сообщить моей модели дилера/покупателя, что она зависит от роли, чтобы я мог использовать (например) Customer.all и просто получать пользователей с ролью «клиент».

Может ли кто-нибудь указать мне в правильном направлении?


person Arne Cordes    schedule 11.08.2012    source источник


Ответы (2)


Разве вы не можете просто применить области действия по умолчанию к своим новым классам?

class Dealer < User
  default_scope { where(:role_id) = Role.find_by_handle('dealer').id }
  ...
end
person Chris Salzberg    schedule 11.08.2012

Вы можете использовать встроенную в Rails функцию Single Table Inheritance. Просто добавьте столбец с именем «тип» в «Пользователь» и установите значение «дилер», «клиент» и т. д.

person Tanzeeb Khalili    schedule 11.08.2012
comment
Хм, да, но у меня есть образец для подражания и я храню роль пользователя как role_id. Поэтому мне нужно что-то вроде STI с role_id:integer вместо type:string. - person Arne Cordes; 11.08.2012