-1

我有一個漂亮的標準Preferences表。我想列出其中每條記錄的所有真正的布爾值。我會怎麼做呢?我知道Preference.column_names會給我所有,但我需要每個記錄的特定true設置。任何想法?類似於Rails:列名如果爲真

@preference.column_names do |c| 
    c if c = true 
end 

謝謝!

+0

你希望所有的布爾列名以'@ preference'該值的'真'的價值? –

+0

完全正確。 –

+0

column_names有什麼值,它是序列化的嗎?舉例 – PriteshJ

回答

3

下面是循環使用屬性名稱和值的對象屬性的一般概念。你是否只需要過濾布爾字段?或者是所有的字段布爾值?

@preference.attributes.each do |attr_name, attr_value| 
    "#{attr_name} is #{attr_value}" if attr_value == true 
end 
+0

感謝您的回答。有一些過濾要做:它是一個關聯模型,並且在那裏有ID,我不需要這個循環。 –

+0

請參閱編輯...應該工作。 –

+1

如果你只是想要名稱,然後像'trues = @ preference.each_with_object([]){| k,v,a | a.push(k)if(v == true)}'應該這樣做。 –

1

首先,您需要知道布爾列,這樣的事情應該給你他們的名字:

booleans = Model.columns.select { |c| c.type == :boolean }.map(&:name) 

然後你可以使用send基於一個名字和一個簡單的提取值「是true」測試需要照顧其餘的:

trues = booleans.select { |name| @preference.send(name) == true } 
+0

這也適用。不知道現在哪個更高效。 –

+1

我不擔心效率這樣的事情,差異幾乎肯定會太小而不必擔心,代碼的昂貴部分可能會在其他地方。採用最清晰,最易讀的方法,這樣你就不會想知道當你在六個月內回到代碼時代碼的作用。 –