Трехколонное соединение в рельсах с активным каркасом - PullRequest
3 голосов
/ 12 сентября 2009

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

(Мой муж имеет многолетний опыт работы с SQL, и он согласен с тем, что таблица соединения из 3 столбцов является правильным подходом. У него нет опыта работы с рельсами.)

Мои три модели: Сотрудник, Проект, Роль, где Роль - это роль сотрудников в проекте. Моя таблица сотрудников_проекты_роль

Что такое СУХОЙ и иным образом эффективный способ сделать это на рельсах? Если есть способ.

У меня не намного больше, чем закомментированные habtm и hmt в моделях и операторы active scaffold в контроллерах.

[Изменить] Забавная ошибка: | Получено с использованием метода hmt во всех трех основных моделях, а также модели EmployeeProjectRole:

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.klass

Extracted source (around line #5):
2:   <tr>
3:     <%
4:     active_scaffold_config_for(@record.class).subform.columns.each :for => @record, :flatten => true do |column|
5:       next unless in_subform?(column, parent_record) and column_renders_as(column) != :hidden
6:       -%>
7:       <th<%= ' class="required"' if column.required? %>><label><%= column.label %></label></th>
8:     <% end -%>

[Редактировать 2] Нашел статью о троичных ассоциациях (дальнейший поиск в Google с использованием этого термина ничего больше не придумал). В основных моделях я закомментировал первую строку, которая следует за статьей:

#    has_many        :employees_projects_roles
    has_many        :roles,     :through => :employees_projects_roles
    has_many        :projects,  :through => :employees_projects_roles

И я получил эту ошибку:

ActiveRecord::HasManyThroughAssociationNotFoundError in EmployeesController#index
Could not find the association :employees_projects_roles in model Employee

, которая кажется не ошибкой active_scaffold, а ошибкой ActiveRecord. Кажется, это подразумевает, что has_many :employees_projects_roles должно быть там, несмотря на то, что предлагает статья. Изменение API с 2008 года возможно?

Ответы [ 4 ]

1 голос
/ 12 сентября 2009

Прежде всего, я бы согласился, похоже, вам нужна таблица соединения из 3 столбцов. Я еще не сделал этого с ActiveRecord, и я думаю, что ваш подход к написанию пользовательской модели, реализующей эту функциональность через два has_many through отношения, не будет плохой идеей.

В вашем особом случае вы можете подумать об использовании плагина, который хорошо обрабатывает сложность ролей. Хороший опыт с этим: acl9

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

0 голосов
/ 17 сентября 2009

Я разместил связанный вопрос здесь . Ответ включал использование :join_table при объявлении связей в модели.

Сообщение об ошибке "nil object", которое я получал, было связано с тем, что объект не был создан. Иногда кажется, что сообщение появляется, когда в таблице нет данных.

Последнее сообщение об ошибке, у меня нет ответа.

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

0 голосов
/ 12 сентября 2009

Существует плагин acts_as_activity_loggable, который представляет собой таблицу с 3 столбцами (на самом деле это 6, поскольку каждый объект определяется типом и идентификатором).

Вы можете заглянуть в него для справки. Имеет:

  • Culprit (объект, вызывающий активность, обычно пользователь)
  • Ссылочный элемент (объект, для которого было зарегистрировано действие)
  • Activity Loggable (объект, из-за которого преступник ссылается на указанный элемент)

Простой пример: пользователь (виновник) создает обзор (журнал активности) для ресторана (ссылка на элемент).

0 голосов
/ 12 сентября 2009

Вы можете создать модель для employees_projects_roles, а затем указать два has_many: через ассоциации:

  has_many :roles, :through => :employees_projects_role, :source => :employees_projects_roles
  has_many :projects, :through => :employees_projects_role, :source => :employees_projects_roles
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...