1

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

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

Таким образом, модель пользователя действует как две разные роли: они могут быть разработчиком темы AND/OR владельца темы. Отношение реализации зависит от таблицы join_users join; возникает вопрос: как правильно обращаться с этой вторичной ассоциацией? Нужно ли мне делать полиморфизм пользователей, а затем сделать ссылку created_by_id «владельцем»? Или что-то проще?

Большое вам спасибо за помощь!

+0

Я вижу, что пользователь может создать несколько темы, но может ли Пользователь «использует» более одного раза за раз? или когда он используется в текущей теме «Пользователи»? – house9

+0

Да, именно поэтому это ассоциация HABTM. Пользователь может создавать несколько тем и использовать несколько тем: подумайте о модели темы, как о документе; поэтому у вас может быть много документов, доступных для разных пользователей, но каждый документ только один создатель/редактор. – tmo256

ответ

1

Я считаю, что вы должны добавить следующую ассоциацию

class User < ApplicationController 
    # a user can create many themes 
    has_many :themes_created, :foreign_key => :creator_id, :class_name => "Theme" 
end 

class Theme < ApplicationController 
    # add a creator_id column in your themes table 
    belongs_to :creator, :class_name => "User" 
end 

Таким образом, вы можете получить все themes созданы некоторые @user через

@user.themes_created 
+0

Проблема в том, что из-за ассоциации HABTM, которая уже существует через theme_users, в пользовательской модели уже есть «has_many: themes» и «user.themes». – tmo256

+0

Просто используйте другое имя. См. Мое редактирование. –

+0

Но вы все еще не можете использовать «user.themes» ... Это так же просто, как сделать то же самое с классом пользователя? Например, в User «has_many: mythemes:: class_name =>« Тема »и вызов через« user.mythemes »? Мне кажется, что это не должно работать ... – tmo256

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