Rails - 返回方法返回true的所有记录

时间:2017-01-12 11:38:01

标签: ruby-on-rails ruby

我有一个方法:

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而不是数组?

提前致谢

2 个答案:

答案 0 :(得分:1)

似乎不可能,在你的情况下你必须进行迭代。我认为最好的解决方案是在表格中添加Boolean列,这样您就可以按查询进行过滤,这样会更快。

在编辑后看到你的方法之后,它似乎因为循环而不慢,因为Person.findklass.find很慢,你在这里做了很多查询和数据库读取。 (你最好使用关联并做一些急切的加载,它会更快)

另一种解决方法是使用ActiveModelSerializers,在序列化程序中,您可以根据条件获取对象的属性。之后,您可以使用逻辑来忽略具有某种标志或属性的对象。

See here the documentation of active model serializer

Conditional attributes in Active Model Serializers

答案 1 :(得分:0)

试试选择方法:https://www.rubyguides.com/2019/04/ruby-select-method/

Role.all.select { |r| r.currently_active? }