来自集合的单行Ruby值

时间:2011-02-12 04:22:37

标签: ruby ruby-on-rails-3 erb

我有一组对象。每个对象有3个属性

'id','name','is_primary'

对象集合通常包含1到5个对象。

我想要做的是检查集合以查看is_primary是否为真。如果是这样输出名称,或至少返回它。

如果可能,我想在一行代码中执行此操作。我试图在轨道中为erb输出减少这一行。稍后在页面中我会输出所有内容。我以为我拥有它,但是如果我返回nil它会增加额外的空间,这会奇怪地移动所有的html。

感谢。

2 个答案:

答案 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输出减少这一行。稍后在页面中我将全部输出。

不需要单行(自从我刚写完一篇文章以来就很有趣):根据需要将代码移动给你的模特或助手,让你的观点保持原始状态。