我有Bit
的集合。他们有一个'摆弄'属性。
如何查询集合中的所有Bit
是否fiddled
等于真?
目前我做
bits.select { |bit| bit.fiddled }.count == bits.count
这看起来效率低下。
答案 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?
的建议更快,因为该解决方案会对可能更多的记录进行计数昂贵。