ActiveRecord对具有属性等于值的集合中的所有对象的true / false查询

时间:2015-07-16 18:44:08

标签: ruby activerecord

我有Bit的集合。他们有一个'摆弄'属性。

如何查询集合中的所有Bit是否fiddled等于真?

目前我做

bits.select { |bit| bit.fiddled }.count == bits.count

这看起来效率低下。

3 个答案:

答案 0 :(得分:0)

您可以检查fiddled false unless bits.where(fiddled: false).any? //logic end 是否为class ActivityLog < ActiveRecord::Base validates :user_id, :instance_id, :action, presence: true validates :user_id, :instance_id, :action, numericality: true belongs_to :user ACTIONS = ['start','stop','create','destroy'] def self.log(action, instance) ActivityLog.create( user_id: instance.user.id, instance_id: instance.id, action: action ) end def action ACTIONS[:action] end def action=(action) write_attribute(:action, ACTIONS.index(action)) end end

enum

答案 1 :(得分:0)

不知道这是否更有效,因为我没有测试它的程序,但是你可以做到这一点,看看哪个测试速度更快:

 Bit.where('fiddled = ?', false) == 0

因此,如果有任何错误,它将返回false,如果全部为真,则返回true。当然,这取决于您是否存在某种限制,以便fiddled永远不会为空。如果它是一个设置为Not Null的布尔列,那么它应该非常可靠。

除此之外,拥有一个布尔列可以为您提供自动?方法。所以

 b = Bit.first
 b.fiddled?

将根据列值返回true或false。

如果你真的想要效率,不要让Rails这样做,有数据库视图为你做。这是最快的方式,因为DB优化得比Rails好得多。

您可以创建一个名为FiddledBits的模型来表示数据库中的视图:

登录您的数据库并创建视图:

CREATE VIEW fiddled_bits AS
SELECT fiddled
FROM bits
WHERE fiddled = false;

然后添加你的虚拟模型:

class FiddledBit < ActiveRecord::Base
  #this is a class that represents a view in the DB.
  def self.all_true?
    FiddledBit.count == 0
  end
end

现在你可以致电:

FiddledBit.all_true?

#=> true

答案 2 :(得分:0)

bits.where(fiddled: false).exists? # => true or false

这将执行类似SELECT 1 FROM bits WHERE fiddled = false的内容,这将比您当前的解决方案更快,并且比使用any?的建议更快,因为该解决方案会对可能更多的记录进行计数昂贵。