我有一个在Rails中运行的查询:
me = User.find(1)
my_groups = me.groups
my_groups
可能会返回多行。
使用方法确定my_groups
或me.groups
是否大于1,是否有快速而肮脏的方法?
也许类似于my_groups.greater_than_one?
如果没有,您会在确定查询是否返回> 1行时建议您使用什么?
me.groups
本质上是另一个与User关联的表。它基本上显示了特定用户所属的“群组”。
答案 0 :(得分:8)
不需要为所有内容提供方法,只需与size
进行比较:
me.groups.size > 1
但是,ActiveRecord::Relation确实有many?
,如果有多条记录,则会返回true
。来自the docs:
如果集合有多个记录,则返回
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
如果您只关心是否有任何元素(即&gt; 0),那么any
(也是Ruby core’s Enumerable的一部分)。
答案 1 :(得分:0)
你可以通过以下方式获得:
if me.groups.count > 1 # or me.groups.size > 1 or me.groups.any?
'bla bla...'
else
....
end
但我建议在User类中使用counter cache。
这样做:
将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
这将减少数据库查询