0

我正在使用Ruby on Rails 3.2.9和Ruby 1.9.3。我有一組符號和一個模型類(ActiveModel),它們具有這些符號(更多其他符號)作爲布爾屬性。給定一個類實例,我想檢索其值爲true的所有屬性名稱。那就是:如何檢索值爲true的實例屬性名稱?

# Given an array of symbols 
[:attr_1, :attr_2, :attr_3] 

# Given a class instance 
<#Model attr_1: true, attr_2: false, attr_3: false, attr_4: true, ... attr_N: true> 

# Then I would like to return 
[:attr_1, :attr_4, ..., :attr_N] 

我該如何做到這一點?

+0

所有屬性返回布爾值? – tokland

+0

@tokland - 並非所有與給定模型類相關的屬性都返回布爾值,但給定數組中存在的屬性「映射」爲給定類返回的布爾值。 – Backo

回答

0

如果你有符號的列表,你可以遍歷它們,並選擇是真正的

symbols = [:attr_1, :attr_2, :attr_3] 
symbols.select {|sym| object.send(sym) == true } 

的那些。如果你沒有通過所有的屬性,你想你可以簡單地重複符號列表該模型的

symbols = object.attributes 
symbols.select {|sym| object.send(sym) == true } 
+1

你可以放心地放棄'== true' – tokland

+0

不是真的,那會返回任何不是'nil'或'false'的東西,這個問題明確地說:「我想檢索它的所有屬性名稱'true'「 –

+0

的確如此,但看着這個例子,我們可以假設所有的值都是布爾值(可能是'''ActiveModel'的方法)。否則,這是一個不好的例子。 – tokland

1
attrs = [:attr_1, :attr_2, :attr_3] 

class Model 
    def are_true?(attr_names) 
    eval(attr_names.map {|a| "send(:#{a})"}.join(" && ")) 
    end 
    def which_true?(attr_names) 
    attr_names.map {|a| a if send(a) == true}.compact 
    end 
end 

m = <#Model attr_1: true, attr_2: false, attr_3: false, attr_4: true, ... attr_N: true> 

m.are_true?(attrs) # evals if all given attr_names are true 
m.which_true?(attrs) # returns array of attr_names which are true 
相關問題