2

我有一个在 Rails 中运行的查询:

me = User.find(1)
my_groups = me.groups

my_groups可能会返回多行。

有没有一种快速而肮脏的方法来使用一种方法来确定是否my_groupsme.groups大于一个?

也许像my_groups.greater_than_one? If not,在确定查询是否返回 >1 行时,您会建议什么?

me.groups本质上是另一个与用户关联的表。它基本上显示了特定用户所属的“组”。

4

2 回答 2

11

不需要所有的方法,你可以简单地比较size

me.groups.size > 1

但是,如果有多个记录, ActiveRecord::Relation确实many?会返回。true文档

true如果集合有多个记录,则返回。相当于 collection.size > 1

class Person < ActiveRecord::Base
  has_many :pets
end

person.pets.count #=> 1
person.pets.many? #=> false

person.pets << Pet.new(name: 'Snoopy')
person.pets.count #=> 2
person.pets.many? #=> true

如果您只关心是否有任何元素(即 > 0),那么存在any(这也是Ruby 核心的 Enumerable 的一部分)。但要小心[nil, false].any? #=> false

于 2013-09-05T01:20:49.733 回答
0

您可以通过以下方式获得:

if me.groups.count > 1 # or me.groups.size > 1 or me.groups.any?
 'bla bla...'
else
  ....
end

但我确实建议在 User 类中使用计数器缓存。

为此:

  1. groups_countusers表中添加列

    add_column :users, :groups_count, :integer, default: 0

  2. 组内模型

    belongs_to :user, counter_cache: true

因此,您可以通过以下方式实现您的目标:

if me.groups_count > 1
 'bla bla...'
else
  ....
end 

这将减少数据库查询

于 2013-09-05T01:37:27.093 回答