我有一个方法:
class Role
def currently_active
klass = roleable_type.constantize
actor = Person.find(role_actor_id)
parent = klass.find(roleable_id)
return true if parent.current_membership?
actor.current_membership?
end
end
我想返回此方法为真的所有Role实例,但是不能用all.each迭代它们,因为这需要大约20秒。我试图使用where语句,但是它们依赖于模型的属性而不是方法:
Role.where(currently_active: true)
这显然会引发错误,因为没有名为current_active的属性。如何以最有效的方式执行此查询,如果可能,使用Active Records而不是数组?
提前致谢
答案 0 :(得分:1)
似乎不可能,在你的情况下你必须进行迭代。我认为最好的解决方案是在表格中添加Boolean
列,这样您就可以按查询进行过滤,这样会更快。
在编辑后看到你的方法之后,它似乎因为循环而不慢,因为Person.find
和klass.find
很慢,你在这里做了很多查询和数据库读取。 (你最好使用关联并做一些急切的加载,它会更快)
另一种解决方法是使用ActiveModelSerializers
,在序列化程序中,您可以根据条件获取对象的属性。之后,您可以使用逻辑来忽略具有某种标志或属性的对象。
答案 1 :(得分:0)
试试选择方法:https://www.rubyguides.com/2019/04/ruby-select-method/
Role.all.select { |r| r.currently_active? }