在rails下计算布尔值

时间:2009-09-01 11:06:59

标签: ruby-on-rails

我在RoR应用程序中的两个模型之间有一个标准的主 - 细节关系。详细记录包含四个表示存在/不存在的布尔字段。

当我显示详细记录时,我想添加一个摘要,指明四个布尔字段中每个布尔值的布尔值设置为True的记录数。

例如: 日期|布尔字段1 |布尔字段2 |等等 2009/08/29 | T | T | 2009/08/30 | T | F | 2009/08/31 | F | T | 2009/09/01 | F | T |

总计:4 2 3

我尝试使用类似@ entries.count([“Boolean Field 1”,true]) 我看到它的方式,有两种方法可以计算这些值:一种是在模型上执行SQL查询(丑陋),另一种是在视图级别使用计数器(再次丑陋)。是否有其他方法可以实现我的目标要什么?

感谢您的时间,

Angelos Arampatzis

4 个答案:

答案 0 :(得分:5)

可能是

@entries.select {|r| r.bool_field1}.size 

答案 1 :(得分:4)

您可以这样做:

@entries.count(:conditions => { :boolean_field_1 => true })

您可以通过执行命名范围来实现这一点:

named_scope :booleans,  :conditions => { :boolean_field_1 => true })

然后

@entries.booleans.count

或者,如果您已经拥有数组中的所有项目(而不是选择少数项目)并且不想访问数据库......

Rails提供了?所有列的方法。所以,虽然你有:

@entry.boolean_field

您还有:

@entry.boolean_field?

所以你可以这样做:

@entries.collect(&:boolean_field?).length

答案 2 :(得分:1)

sql并不像rails那样丑陋而且效率很高,只需将它变为named_scope,你的控制器/视图看起来仍然很漂亮

答案 3 :(得分:0)

由于所有条目都作为Rails对象,因此可以使用最短形式:

    <script type="module" src="https://unpkg.com/x-frame-bypass"></script>
        <iframe 
            src   = "https://www.google.com/maps/space/iss/@29.5602853,-95.0853914,2a,75y,202.74h,105.19t/data=!3m6!1e1!3m4!1szChzPIAn4RIAAAQvxgbyEg!2e0!7i10000!8i5000"
            is="x-frame-bypass" 
            class = "wikipedia"
            width       = "640" 
            height      = "360" >
        </iframe>

它正在使用@entries.count(&:boolean_field1?)

请记住,使用Ruby(相对于SQL)很重要。如果您希望在不从数据库读取所有记录的情况下进行计数,则需要使用其他方法来提高效率。