2013-07-28 6 views
1

Приложение, которое я создаю, позволяет пользователям загружать ваучеры. Работодатели подписываются на учетную запись, добавляют сотрудников (которые получают логин), выбирают, какие ваучеры для включения, а затем сотрудники могут видеть включенные ваучеры и загружать.Несколько моделей моделей и основанных на разрешении

Первоначально я создал две модели моделей: служащий и работодатель. Это было настолько активно, что ассоциации записей были бы простыми (у работодателя было много сотрудников, у служащих были ваучеры). Но это также означает отдельные таблицы базы данных и, следовательно, отдельные знаковые формы.

Я просмотрел отдельные формы форм для нескольких пользователей, и this, похоже, согласился, что вместо этого вы должны иметь одну модель пользователя и использовать CanCan и Rolify для разрешений. Но проблема с , что вы не можете (я верю?) Делать активные ассоциации записей между этими двумя ролями (не отдельные модели).

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

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

+0

Почему вы не можете создавать ассоциации на основе ролей? Не можете ли вы иметь текстовое поле с ролью в пользовательской модели, а затем создать область или ассоциацию через область? Кроме того, по-моему, для настройки auth требуется меньше времени, чем для настройки Devise. – Mohamad

+0

Связь с чем? Обычно у вас есть что-то вроде «работодатель has_many сотрудников». Но в этом случае это единственная модель - Пользователь. Не могли бы вы привести мне пример? В основном мне нужно, чтобы работодатель has_many Employees и Employer/Employee has_many Vouchers. Я не доверяю себе вопросы шифрования/безопасности прямо сейчас, чтобы оставить Devise, начиная с Rails. –

ответ

3

Так мой друг решил это очень элегантно для меня, для всяких ссылок:

Хороший вопрос. Это большая проблема, связанная с перекрестком между хорошей техникой (модельная реализация, дизайн базы данных) и пользовательским интерфейсом (однозначная форма).

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

Наследование отдельных таблиц обычно представляется идеальным решением, но, как правило, избегать применения Ruby on Rails, если это абсолютно необходимо.

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

  • модель работодателя.
  • Модель сотрудника.
  • A SignIn/Login/Credentials/WhateverYouWantToCallIt модель.

С точки зрения ассоциаций работодателя/работника, как и раньше:

  • Сотрудник BELONGS_TO: работодатель
  • has_many
  • Работодатель: сотрудники

Теперь, учитывая, что обе модели имеют возможность подписать в, имеет смысл разделить эти учетные данные в свою собственную модель SignIn. Если вы прочитаете полиморфные ассоциации (http://guides.rubyonrails.org/association_basics.html#polymorphic-associations), вы обнаружите, что они являются удивительными для создания отношений, в которых ассоциация может быть с разными моделями.

Так что теперь вам нужно создать связь между знаком в учетных данных и работодатель и работник:

  • зарегистрировались: belongs_to: signinable, полиморфный: истинный has_one
  • Работодателя: sign_in, как:: signinable
  • Employee has_one: sign_in, as:: signinable

Элегантность этого решения (на мой взгляд) заключается в том, что вы можете разделить свой SignIn, Employer и Employee m которые не только соответствуют хорошим соглашениям Ruby on Rails, но и являются хорошей практикой нормализации базы данных. В то же время у вас есть модель SignIn, которая делает тривиальным внедрение лучшего знака в виде форм, который позволяет как работодателям, так и сотрудникам войти в систему.

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