Rails,如何确定嵌套记录集是否存在

时间:2011-04-15 17:03:11

标签: ruby-on-rails ruby ruby-on-rails-3

我有以下两种模式:

Project, has_many ProjectParticipants
ProjectParticipants, belongs_to Project

如何确定给定这5个ProjectParticipants,它们是否属于项目?

此外,它应该严格地为5,而不是更多或更少。

关于如何优雅地解决此类计数的任何想法?

2 个答案:

答案 0 :(得分: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将设置为他们共享的项目,否则将为nil / false。

所以你可以这样做:

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

答案 1 :(得分: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方法将给定数组组织成一个哈希,其中键被指定为参数,值是匹配的对象列表。对于这样的情况,它可以很方便。