【问题标题】:Check boolean attributes in all child objects in Rails检查 Rails 中所有子对象的布尔属性
【发布时间】:2011-10-23 20:23:44
【问题描述】:

我有一个包含多个参与者的会议模型。参与者有一些布尔属性:接受、拒绝等。我想检查会议的所有参与者是否都被接受 == true。 有没有一种类似于 sum 方法(如 total_price = items.sum(&:price) )的快速方法来检查子对象的所有布尔属性?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord parent-child has-many


    【解决方案1】:
    meeting.participants.all?(&:acctepted)
    

    看看enumerable module

    【讨论】:

    • 请注意,此解决方案将所有参与者加载到内存中,然后循环通过它们,而不是下面 mu 的(更好)解决方案,它应该是 log(n)
    • 视情况而定。如果参与者已经加载,我的解决方案不会用额外的查询来打扰数据库,如果不是 mu 的解决方案更好。
    • 感谢克洛克纳。我没有意识到。
    • @topek - 没有争论,我认为他只是在使用会议模型,但如果参与者被加载,你是正确的关于不点击数据库
    【解决方案2】:

    你可以使用count:

    all_true = items.count(:conditions => [ 'bool_column = ?', true ]) == items.count
    

    如果您的布尔列中不需要担心 NULL:

    all_true = items.count(:conditions => [ 'bool_column = ?', false ]) == 0
    

    或者你可以这样做(如klochner 所建议的那样)来解决通常的 NULL 问题并避免重复 count

    all_true = items.count(:conditions => [ 'bool_column = ? or bool_column is null', false ]) == 0
    

    您也可以同时检查多个布尔列。

    【讨论】:

    • 如果您只添加 "bool_column is null or bool_column = ?",false,第二个版本将适用于 null
    • @klochner:好的,感谢您指出这一点,我已经相应地修补了答案。
    猜你喜欢
    • 2013-03-20
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多