这样可以获得我需要的数据:
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>
如何检查并返回可链接的内容?
答案 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的所有数组项。