2013-05-08 3 views
1

У меня есть модель Пользователь и модель Рекрутер. В настоящее время это две отдельные таблицы, но я хочу сделать их одним.Наследование отдельных таблиц с условиями

ток:

  • Пользователь: идентификатор, имя пользователя, пароль, имя
  • Рекрутер: идентификатор, user_id

Ideal:

  • пользователя: ID, имя пользователя, пароль , роль (рекрутер, администратор)

Я понимаю основы ИППП. Мне интересно, когда я выполняю методы на новом контроллере Recruiter (который наследуется от пользователя), как я могу убедиться, что все мои методы вызывают пользователей, которые являются только рекрутером? Таким образом, запросы по строкам ... SELECT * FROM users WHERE role = 'recruiter' для всего.

ответ

1

Это то, что рельсы заботятся о вас, из коробки. Вам не нужно вручную запрашивать определенный тип пользователя, просто запрашивать нужную модель.

Я должен также отметить, что по умолчанию рельсы предполагается, что sti_column называется type, но может быть переопределен role легко.

+0

Столько, сколько я хочу ненавидеть, как явные рельсы есть, такие вещи, как это делает его очень злыми. У вас есть зеленая галочка! Спасибо, Пунеет! –

1

Допустим, у вас есть 2 классов:

class User < ActiveRecord::Base 
end 

class Recruiter < User 
end 

Rails будет автоматически добавить типа столбец в пользователей стол так, что в контроллере, если вы делаете что-то вроде этого:

class RecruitersController < ApplicationController 
    def index 
    @recruiters = Recruiter.all 
    end 
end 

Rails автоматически выберет записи с помощью type = 'Recruiter', и вам даже не нужно устанавливать это вручную. Если вы делаете:

Recruiter.new(name: 'John').save 

Новый пользователь будет создан в базе данных с полем типа набор для «Рекрутер».

1

вы бы определить свои модели что-то вроде этого:

class User < ActiveRecord::Base 
    ... 
end 

class Recruiter < User 
... 
    def initialize 
    # ... special initialization for recruiters/you could put it here 
    super 
    end 
... 
end 

и создать новый рекрутер, вы могли бы сделать это:

Recruiter.create(:name => "John Smith") 

и из-за атрибута type в таблице пользователей STI (устанавливается в «Рекрутер»), запись будет для рекрутера.

Вы можете поместить специальную инициализацию для моделей STI либо в инициализатор модели, либо в фильтр before с if-каскадом, проверяющим тип. Инициализатор, вероятно, намного чище.

+0

Рельсы настолько круты, что это ошеломило мой разум. Это тоже помогло - я бы хотел наградить вас зелеными. –

Смежные вопросы