2011-04-15 60 views
0

我有以下两种模式:Rails中,如何确定一个嵌套的记录集Exsits

Project, has_many ProjectParticipants 
ProjectParticipants, belongs_to Project 

我如何请求,以确定这些给予5个ProjectParticipants,他们是否属于一个项目?

另外,它应该严格那些5,不多或少。

关于如何优雅地解决这种类型的计数的任何想法?谢谢

回答

1

假设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? 

有关此方法的好处是,它短路,如果一个的参与者没有相同的项目(效率更高)。

编辑:

要返回的项目,他们都共享,你可以这样做:

first_participant = participants.shift 

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

project_shared将被设置为项目,他们都是共享的,否则这将是零/假。

那么你就可以这样做:

if project_shared 
    # do work 
else 
# they dont share a project! 
end 
+0

迈克这是问题,我没有一个项目。鉴于参与者,我想确定这些人的项目是否存在? – AnApprentice 2011-04-15 17:08:50

+1

好的,根据你的评论编辑答案。 – 2011-04-15 17:12:57

0

您可以在一组比较的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方法会将给定的数组组织为散列,其中键被指定为参数,并且该值是匹配的对象列表。它适用于这种情况。

相关问题