我的app上需要一个模型(?),它基本上包含另一个实体的状态。在实体中我想存储状态的ID,但在我的应用程序中,视图是根据一个好的单词描述进行讨论。例如,1 = New,2 = Used etc等。
如何以最佳方式实现此功能,这意味着我可以轻松设置和检索此状态列而无需重复自己?
最终我想要像
这样的东西Foo.status = 'New' (actually sets value to 1)
和
Foo.status (returns 'New', but stores 1)
我是否以正确的方式思考这个问题?
答案 0 :(得分:13)
您可以编写自定义编写器方法:
STATUS_VALUES = { 1 => 'new', 2 => 'modified', 3 => 'deleted' }
class Foo
attr_reader :status_id
def status
STATUS_VALUES[@status_id]
end
def status=(new_value)
@status_id = STATUS_VALUES.invert[new_value]
new_value
end
end
例如,以下程序:
foo_1 = Foo.new
foo_1.status = 'new'
puts "status: #{foo_1.status}"
puts "status_id: #{foo_1.status_id}"
foo_1.status = 'deleted'
puts "status: #{foo_1.status}"
puts "status_id: #{foo_1.status_id}"
输出:
status: new
status_id: 1
status: deleted
status_id: 3
答案 1 :(得分:3)
我会继续使用符号,例如
Foo.status = :new
它们基本上是不可变的字符串,这意味着无论你在代码中使用相同的符号多少次,它仍然是内存中的一个对象:
>> :new.object_id
=> 33538
>> :new.object_id
=> 33538
>> "new".object_id
=> 9035250
>> "new".object_id
=> 9029510 # <- Different object_id
答案 2 :(得分:0)
一种方法可能是使用常量
module MyConstants
New = 1
Used = 2
end
然后你可以像这样使用它们
Foo.status = MyConstants::New
或者甚至喜欢这样,如果你仔细考虑命名空间污染
include MyConstants
Foo.status = New
另一个想法,也许你想使用state machine。