2014-10-06 3 views
1

Я недавно столкнулся с несколькими сценариями, где мне нужно добавить модель в другую модель более одного раза.Rails добавить модель в другую модель дважды

Примеры:

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

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

Как я могу добавить второе поле db, которое указывает на ту же модель, что и другое поле? Прямо сейчас сообщение было бы user_id:integer, и каждый вопрос имел бы survey_id:integer.

Для опроса с вопросами, я думаю, что, возможно, я просто добавлю логическое свойство «скрининга» на вопросы, а затем просто добавлю все вопросы в массив survey.questions и фильтрует свойство скрининга. Но я не уверен, что это лучший путь.

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

ответ

2

Looks like you need a has_many, :through relation.

Вы разгружать user_id в другой таблице (определяемой пользовательской модели, скажем, PostRelation), где столбцы выглядят как:
user_id | post_id | kind | created_at | updated_at

Вы определяете вид связи на kind колонке (как «точки зрения ',' edit ',' owner ') и post_id и user_id не требуют пояснений.

В этом случае отношения будут:

  • Сообщение has_many :users, through: :post_relation
  • Сообщение has_many :post_relations
  • Пользователь has_many :posts, through: :post_relation
  • Пользователь has_many :post_relations
  • PostRelation belongs_to :user
  • PostRelation belongs_to :post

Тогда в модели пользователя/сообщений вы можете определить пользовательские методы, которые отфильтровать сообщения, основанные на PostRelation статус:

class Post def editors self.post_relations.includes(:users).where(kind: 'edit') end end

+0

Именно то, что мне было нужно. Отлично –