Наследование одной таблицы: тип определяется как константа

Я пытаюсь использовать наследование Single Table, чтобы представить, что сотрудники могут быть менеджерами или консультантами. Итак, вот моя модель сотрудников:

class Employee < ActiveRecord::Base
  belongs_to :communaute
      self.inheritance_column = :fonction

  scope :manager, -> { where(fonction: 'Manager') } 
  scope :consultant, -> { where(fonction: 'Consultant') } 
end

и вот мои подклассы:

class Consultant < Employee
end


class Manager < Employee
end

Когда я открываю новое представление для создания сотрудника. У меня есть ошибка неопределенного метода `fonction', когда я пытаюсь перечислить типы сотрудников. Я не понимаю, почему, потому что я определил это в контроллере сотрудников. Не могли бы вы помочь мне с этой ошибкой, пожалуйста.

Ниже моей новой формы

<%= form_for(@employee) do |f| %>
  <% if @employee.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@employee.errors.count, "error") %> prohibited this employee from being saved:</h2>

      <ul>
      <% @employee.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>

  <div class="field">
  <%= f.label :fonction %><br>
  <%= f.select :fonction, Employee.fonction.map {|r| [r.humanize, r.camelcase]}, {}, disabled: @fonction !=    "Employee" %> 

  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

И мой сотрудник контроллер

class EmployeesController < ApplicationController
  before_action :set_employee, only: [:show, :edit, :update, :destroy]
  before_action :set_fonction

  def index
    @employees = Employee.all
    #@employees = fonction_class.all
  end

  def show
  end

  def new
    #@employee = fonction_class.new
    @employee = Employee.new
  end

  def edit
  end

  def create 
       @employee = Employee.new(employee_params)
       if @employee.save
         redirect_to @employee, notice: "#{fonction} was successfully created."
       else
         render action: 'new'
       end
   end

  def update
  end

  def destroy
  end

  private
  def fonction 
      params[:type] || "Employee" 
  end
     def set_fonction
        @fonction = fonction 
     end
    # def fonction_class 
     #    fonction.constantize 
     #end

     def set_animal
         @employee = fonction_class.find(params[:id])
       end
       def employee_params 
            params.require(fonction.downcase.to_sym).permit(:name, :fonction) 
        end
end

person Medmax    schedule 29.01.2014    source источник


Ответы (2)


Вам нужно определить fonction в вашей модели (app/models/employee.rb)

То, как вы его используете, подразумевает, что он определен как метод класса и метод экземпляра. Также похоже, что это может быть массив? Employee.fonction.map {|r| ... или атрибут (поскольку у вас есть выбор, чтобы установить его для сотрудника.)

Однако вы определяете функцию как строку...

def fonction 
  params[:type] || "Employee" 
end

Так что я не совсем уверен, чего вы пытаетесь достичь здесь... Все, что я знаю, это то, что Employee.fonction выглядит как метод класса модели...

def self.fonction
  ...
end

а f.select :fonction выглядит как метод экземпляра или атрибут?

РЕДАКТИРОВАТЬ Думаю, у меня есть это... (Извините, я пропустил ссылку fonction в определении вашей модели)

Попробуйте добавить это в свою модель Employee:

def self.fonction
  ["Manager", "Consultant", "Employee"]
end

РЕДАКТИРОВАНИЕ №2

Вы также можете определить константу в своей модели

FONCTIONS = ["Manager", "Consultant", "Employee"]

def fonction
  FONCTIONS
end
person Kyle Macey    schedule 29.01.2014
comment
def self.fonction [Менеджер, Консультант, Сотрудник] end Это работает для нового представления, тезисы являются просто строками или представляют подклассы? - person Medmax; 30.01.2014
comment
@Medmax это список строк, представляющих возможные параметры класса/подкласса. - person Kyle Macey; 30.01.2014

Вы создали столбец fonction?, создайте его, введя в свой терминал, когда в каталоге вашего приложения:

rails g migration add_fonction_to_employees fonction
rake db:migrate

Затем проверьте, что в вашей БД есть столбец fonction в таблице сотрудников.

person sites    schedule 29.01.2014