Ruby - 如果所有来自关系属性都相同

时间:2014-08-09 16:25:48

标签: ruby-on-rails ruby relation

这个我觉得很简单。

我有房间,我有客户。每个房间都有很多客户。

在我的房间#1我有4个客户,他们都是女性(client.sex =“F”)。

我想检查这是真是假。我这样做:

Room.first.clients.all? {|c| c.sex == "F" }

然后返回真实!哪个很酷。但我们认为性别可能是“F”,“M”,“A”,“B”,“C”“N”,我想检查一个特定房间的所有客户是否有同性。我怎么能这样做?

Room.first.clients.all? {|c| c.sex == "same as all other clients from this room" }

我当然能做到:

sexbase = Room.first.clients.first.sex
Room.first.clients.all? {|c| c.sex == sexbase }

但有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

这减少了数据库检索...

array = Room.first.clients.pluck(:sex)
array.count(array[0]) == array.count

答案 1 :(得分:1)

您甚至可以使用单个数据库查询进行检查:

Room.first.clients.distinct.count(:sex) > 1

在这里,您可以计算关系中不同的性别值,如果它超过1,那么您的关系中会有不同的值。

另外,如果您对显示的值感兴趣,可以提取不同值的数组,然后检查它的大小:

values = Room.first.clients.distinct.pluck(:sex) # ['M', 'F'] or ['M'], for example
values.size > 1