我有一个包含30个属性的模型。但这些属性可以分为两组。
例如我有:
string:title
string:text
...
和
string:title_old
string:text_old
...
我希望能够:当我同时检查title
属性以检查title_old
属性时。如果我创建了15个第一个字符串的数组,或者我应该编写硬编码的if语句
最终目标:
[
{
:name => :title,
:y => 1 (constant),
:color=> red, (if title_old == "something" color = red else color = green)
},
{
:name=> :text,
:y => 1 (constant)
:color => red (if text_old == "something" color = red else color = green)
},
.... (all other 13 attributes)
]
答案 0 :(得分:1)
你的模特:
class MyModel < AR::Base
def attributize
attrs = self.attributes.except(:created_at, :updated_at).reject{ |attr, val| attr =~ /.*_old/ && !val }
attrs.inject([]) do |arr, (attr, val)|
arr << { :name => attr, :y => 1, :color => (self.send("#{attr}_old") == "something" ? "red" : "green") }
end
end
end
用法:
my_object = MyModel.last
my_object.attributize
答案 1 :(得分:1)
很简单的例子:
class MyModel
def identify_color
if send("#{name}_old".to_sym) == "something"
'red'
else
'green'
end
end
end
MyModel.all.collect do |instance|
attrs = instance.attributes
attrs.merge!('color' => identify_color)
attrs
end
随意添加一些救援,但可以通过不同方式完成。
答案 2 :(得分:0)
试试这个:
[
:title,
..,
..
:description
].map do |attr|
{
:name => attr,
:y => 1 (constant),
:color=> (read_attribute("#{attr}_old") == "something") ? "red" : "green"
}
end
PS:命名属性text
是一个坏主意。
答案 3 :(得分:0)
使用state_machine,这样你的逻辑就会在一个带有清晰dsl的地方。 https://github.com/pluginaweek/state_machine