我有一个在 Rails 中运行的查询:
me = User.find(1)
my_groups = me.groups
my_groups
可能会返回多行。
有没有一种快速而肮脏的方法来使用一种方法来确定是否my_groups
或me.groups
大于一个?
也许像my_groups.greater_than_one?
If not,在确定查询是否返回 >1 行时,您会建议什么?
me.groups
本质上是另一个与用户关联的表。它基本上显示了特定用户所属的“组”。
我有一个在 Rails 中运行的查询:
me = User.find(1)
my_groups = me.groups
my_groups
可能会返回多行。
有没有一种快速而肮脏的方法来使用一种方法来确定是否my_groups
或me.groups
大于一个?
也许像my_groups.greater_than_one?
If not,在确定查询是否返回 >1 行时,您会建议什么?
me.groups
本质上是另一个与用户关联的表。它基本上显示了特定用户所属的“组”。
不需要所有的方法,你可以简单地比较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
。
您可以通过以下方式获得:
if me.groups.count > 1 # or me.groups.size > 1 or me.groups.any?
'bla bla...'
else
....
end
但我确实建议在 User 类中使用计数器缓存。
为此:
groups_count
向users
表中添加列
add_column :users, :groups_count, :integer, default: 0
组内模型
belongs_to :user, counter_cache: true
因此,您可以通过以下方式实现您的目标:
if me.groups_count > 1
'bla bla...'
else
....
end
这将减少数据库查询