我有以下两种模式:Rails中,如何确定一个嵌套的记录集Exsits
Project, has_many ProjectParticipants
ProjectParticipants, belongs_to Project
我如何请求,以确定这些给予5个ProjectParticipants,他们是否属于一个项目?
另外,它应该严格那些5,不多或少。
关于如何优雅地解决这种类型的计数的任何想法?谢谢
我有以下两种模式:Rails中,如何确定一个嵌套的记录集Exsits
Project, has_many ProjectParticipants
ProjectParticipants, belongs_to Project
我如何请求,以确定这些给予5个ProjectParticipants,他们是否属于一个项目?
另外,它应该严格那些5,不多或少。
关于如何优雅地解决这种类型的计数的任何想法?谢谢
假设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
您可以在一组比较的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
方法会将给定的数组组织为散列,其中键被指定为参数,并且该值是匹配的对象列表。它适用于这种情况。
迈克这是问题,我没有一个项目。鉴于参与者,我想确定这些人的项目是否存在? – AnApprentice 2011-04-15 17:08:50
好的,根据你的评论编辑答案。 – 2011-04-15 17:12:57