大于一的方法?

时间:2013-09-05 01:16:45

标签: ruby-on-rails ruby

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

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

my_groups可能会返回多行。

使用方法确定my_groupsme.groups是否大于1,是否有快速而肮脏的方法?

也许类似于my_groups.greater_than_one?如果没有,您会在确定查询是否返回> 1行时建议您使用什么?

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

2 个答案:

答案 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

这样做:

  1. groups_count列添加到users表格

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

  2. 在群组模型中

    belongs_to :user, counter_cache: true

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

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

    这将减少数据库查询