Рельсы, самосборный стол, правильный способ создания - PullRequest
0 голосов
/ 07 июня 2011

Для моего веб-приложения мне необходимо установить отношения между руководителем и студентом. Мне нужно соединить таблицу «Персона» с собой через таблицу «Наблюдение».

class Person < ActiveRecord::Base

  has_many :supervised, :class_name => 'Supervision', :foreign_key => 'supervisor_id'
  has_many :supervisors, :class_name => 'Supervision', :foreign_key => 'supervised_id'

end

class Supervision < ActiveRecord::Base

  belongs_to :supervised, :class_name => 'Person'
  belongs_to :supervisor, :class_name => 'Person'
end

Теперь мне нужна помощь относительно контроллера. Я не уверен, что мне нужны два контроллера, один для супервизоров и один для супервизоров или только один контроллер "Супервизор".

Как ученик, так и руководитель должны иметь возможность создавать «Наблюдение». Я просто не уверен, как сообщить контролеру, должен ли текущий пользователь быть руководителем или студентом. Есть мысли?

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Вы можете создать два контроллера, но это не будет DRY , поэтому, вероятно, этого лучше избегать. Вы можете настроить маршруты так, чтобы URL для Prof / Student казались разными, но на самом деле отображались на тот же контроллер.

Сколько студентов проф:

the_prof = Person.find( *my record number* )
the_prof.supervised.count

Кто они, это то же самое, так что покажите их имена

the_prof.supervised.each do |student|
  puts student.name
end

Как определить, кто профессор или нет? Я бы добавил логический флаг в таблицу people: is_prof

Моя первоначальная мысль заключалась в том, чтобы определить, был ли человек студентом, если у него нет supervised. Если у профессора, у них нет supervisor, но это ломается, если Профессор избавляется от всех своих учеников или Студент избавляется от всех своих Профессоров. Внезапно мы находимся в стране undefined , которая BAD .

Флаг также облегчает разделение всех профессоров и студентов, поэтому вы можете сделать

profs = Person.find_by_is_prof( true )
studs = Person.find_by_is_prof( false )

(не забудьте проиндексировать это поле в вашей базе данных)

0 голосов
/ 08 июня 2011

Я предполагаю, что в итоге вы создадите по крайней мере два контролера: один для людей, выполняющих функции супервизоров, т. Е. Один для управления подчиненными; и один, чтобы управлять своей личной записью. У вас может даже быть другой, который управляет регистрацией человека и позволяет ему выбирать своего руководителя, как часть шага в стиле волшебника.

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

Если вы обнаружите, например, что вам нужен список своих подчиненных, то это, вероятно, страница индекса SubordinatesController #. Добавление подчиненного, вероятно, будет парой #new / #create в этом контроллере.

Контроллеры действительно должны выяснить, как пользовательский интерфейс будет реагировать на различные действия пользователя. Установка / my / supervisor и заметка о том, что я / чужой / наблюдатель, вероятно, относятся к совсем другим вещам на уровне пользовательского интерфейса. То, что они находятся в одной таблице, не означает, что пользовательский интерфейс должен отражать эту симметрию.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...