我有一组对象。每个对象有3个属性
'id','name','is_primary'
对象集合通常包含1到5个对象。
我想要做的是检查集合以查看is_primary是否为真。如果是这样输出名称,或至少返回它。
如果可能,我想在一行代码中执行此操作。我试图在轨道中为erb输出减少这一行。稍后在页面中我会输出所有内容。我以为我拥有它,但是如果我返回nil它会增加额外的空间,这会奇怪地移动所有的html。
感谢。
答案 0 :(得分:1)
嗯,如果没有元素is_primary
,这就不行了......我还在想......
c.detect(&:is_primary).name
好的,怎么样:
((a = c.detect(&:is_primary)) && a.name).to_s
实际上,在<%=
表达式的erb模板中可以返回nil
,这只会产生一个空字符串,所以对于这种情况你可以使用:
(a = c.detect(&:is_primary)) && a.name
更新:响应第一条评论,我确实有一个我没有发布的测试用例......
class A; attr_accessor :is_primary, :name, :id; end
t = [A.new, A.new, A.new, (a = A.new; a.name = 'xyz'; a.is_primary = true; a)]
puts (a = t.detect(&:is_primary)) && a.name
puts ((a = [].detect(&:is_primary)) && a.name).to_s
答案 1 :(得分:0)
补充@DigitalRoss,你也可以写:
collection.detect(&:is_primary).try(:name) || "default_if_no_element_or_name"
(说实话,我更喜欢Ick的可能而不是Rails'尝试:c.detect(&:is_primary).maybe.name
)
旁注:恕我直言,一个只能在一行中激活的旗帜,这不是一个好主意。您可能有多个不一致的状态,其中有多个处于活动状态,您在更新时会担心(事务等)。尝试将PK引用存储在其他地方(父模型?状态模型?)。
如果可能,我想在一行代码中执行此操作。我试图在轨道中为erb输出减少这一行。稍后在页面中我将全部输出。
不需要单行(自从我刚写完一篇文章以来就很有趣):根据需要将代码移动给你的模特或助手,让你的观点保持原始状态。