has_many.size大于0的Rails?

时间:2014-10-16 04:14:16

标签: ruby-on-rails activerecord model where has-many

这样可以获得我需要的数据:

  def has_function
    services = []
    Service.find_each do |s|
      if s.functions.size > 0
        services << s
      end
    end
    return services
  end

但是,该方法返回一个数组,我打算将其链接到别处:

Service.has_function.visible.includes(:layer)
undefined method `where' for #<Array:0x007faad487a970>

如何检查并返回可链接的内容?

2 个答案:

答案 0 :(得分:4)

你想在加入中做爵士乐,所以它都留在ActiveRecord中。另外......由于它是一个单独的SQL查询,因此速度会快得多。只要确保你有适当的指数。

Service.joins(:functions).visible.includes(:layer)

如果您想查看超出存在的任何内容,请说计数&gt; 1;你必须做小组/有。

Service.
  joins(:functions).
  select('services.*, count(functions.id) as function_count').
  group('services.id').
  having('function_count > 2')

答案 1 :(得分:-2)

使用内部联接。

Service.joins(:functions).visible.includes(:layer)

这会生成以下SQL:

SELECT * from `services` INNER JOIN `functions` on `services`.`id`=`functions`.`service_id`

该内部联接将消除没有功能的服务。

此外,如果你将来需要这样的东西,这里有一个可以清理你之前写的功能的风格:

def has_function
  Service.select { |s| s.functions.any? }
end

在ActiveRecord模型上没有那么好,因为还有其他方法可以做到,但在Ruby中,一般来说,你不需要初始化数组,将数据推送到它上面,然后返回它。 Array#select将保留传入块返回true的所有数组项。