2013-07-05 3 views
2

Я пытаюсь реализовать несколько простой STI в Rails 4, но кое-чего еще не удается достичь.Наследование отдельных таблиц в Rails 4

я следующие классы:

class Person < ActiveRecord::Base 
end 

class NaturalPerson < Person 
end 

class LegalPerson < Person 
end 

class Employee < NaturalPerson 
end 

class Customer < NaturalPerson 
end 

Дело в том, у меня есть некоторые атрибуты, которые я хочу получить доступ только из класса Employee, некоторые только от клиента, и т.д., но я не могу найти путь. Если бы я использовал Rails 3, я бы решил его с attr_accesible. Но теперь это невозможно, так как я не использую драгоценный камень attr_accesible, и я не желаю этого.

ответ

4

Я woud использовать различные person_params в моем контроллере,

def person_params 
params.require(:person).permit(:email, :last_name, :first_name) 
end 

def natural_person_params 
params.require(:person).permit(:email, :job, :location) 
end 

и создать метод, где я хотел бы проверить имя класса объекта или атрибут типа, как это STI), чтобы определить, какой Params использовать. ..

Надеется, что это помогает

Приветствия

+0

А что, если я хочу, чтобы создать человек вне контроллера? Возможно ли это? Я относительно новичок в Rails, поэтому у меня может быть концептуальная ошибка. Благодаря! –

+0

Снова прочитав мой комментарий, я, возможно, не был бы ясен. Я имел в виду, что, если я хочу обработать экземпляр NaturalPerson вне контроллера? Как определить атрибут, доступный только для NaturalPerson? Способ ActiveRecord обрабатывает атрибуты Person, все дочерние элементы Person будут иметь доступ ко всем атрибутам. Благодаря!!! –

+0

Не уверен, я еще не тестировал STI в Rails 4 (просто быстро прочитал документы). – phron

3

Если вы пытаетесь использовать один контроллер для всех моделей, а затем положить все Аттрибут ibutes в белые перечисленные параметры.

def person_params 
    params.require(:person).permit(:email, :last_name, :first_name, :job, :location) 
end 

Если вы хотите, чтобы отделить их, то вы хотите, отдельный Params для каждого типа человека:

def person_params 
    params.require(:person).permit(:email, :last_name, :first_name) 
end 

def employed_person_params 
    params.require(:person).permit(:email, :job, :location) 
end 
Смежные вопросы