我在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
答案 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)很重要。如果您希望在不从数据库读取所有记录的情况下进行计数,则需要使用其他方法来提高效率。