我有以下两种模式:
Project, has_many ProjectParticipants
ProjectParticipants, belongs_to Project
如何确定给定这5个ProjectParticipants,它们是否属于项目?
此外,它应该严格地为5,而不是更多或更少。
关于如何优雅地解决此类计数的任何想法?
答案 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
方法将给定数组组织成一个哈希,其中键被指定为参数,值是匹配的对象列表。对于这样的情况,它可以很方便。