Rails, как определить, существует ли вложенный набор записей - PullRequest
0 голосов
/ 15 апреля 2011

У меня есть две следующие модели:

Project, has_many ProjectParticipants
ProjectParticipants, belongs_to Project

Как я могу запросить данные 5 участников проекта, принадлежат ли они к проекту?

Кроме того, это должны быть строго те 5, не более или менее.

Есть мысли о том, как элегантно решить для этого типа подсчета?

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

Предположим, participants содержит 5 участников, которых вы хотите проверить.

participants.all? {|o| o.project }

Это вернет true всех участников проекта, иначе false.

Чтобы вернуть найденный проект, вы можете сделать:

И посмотреть, есть ли у всех участников один и тот же проект:

first_participant = participants.shift

participants.all? {|o| o.project == first_participant.project} unless first_participant.nil?

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

Edit:

Чтобы вернуть проект, которым они все делятся, вы можете сделать:

first_participant = participants.shift

project_shared = participants.all? {|o| o.project == first_participant.project} and first_particpant.project unless first_participant.nil?

project_shared будет установлен для проекта, которым они все делятся, иначе будет nil / false.

Итак, вы можете сделать:

if project_shared
  # do work
else
 # they dont share a project!
end
0 голосов
/ 15 апреля 2011

Вы можете сравнить свойства записей ProjectParticipant в группе:

participants.length == 5 and participants.all? { |p| p.project_id == project.id }

Это подтверждает, что ваш массив участников содержит пять записей и что всем им присвоен одинаковый идентификатор project_id. Сравнение p.project == project будет иметь побочный эффект загрузки одного и того же проекта пять раз.

Чтобы проверить, принадлежат ли они просто проекту, вы можете сделать это:

participants.length == 5 and participants.all? { |p| p.project_id? }

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

participants.length == 5 and participants.all? { |p| p.project }

Вы также можете использовать метод group_by, чтобы проверить, не задействован ли только один проект:

grouped = participants.group_by(&:project)
!grouped[nil] and grouped.length == 1 and grouped.first[1].length == 5

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

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