Rails - константы хеша? - PullRequest
8 голосов
/ 04 мая 2009

Мне нужна модель (?) В моем приложении, которая в основном содержит статус другой сущности. В сущности я хочу сохранить идентификатор статуса, но в моем приложении представление говорит в терминах хорошего описания слова. Например, 1 = новый, 2 = использованный и т. Д. И т. Д.

Как я могу реализовать это наилучшим образом, что означает, что я могу легко установить и получить этот столбец состояния, не повторяя себя?

В конечном итоге я бы хотел что-то вроде

Foo.status = 'New'  (actually sets value to 1)

и

Foo.status  (returns 'New', but stores 1)

Думаю ли я об этом правильно?

Ответы [ 3 ]

13 голосов
/ 04 мая 2009

Вы можете написать собственный метод записи:

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
3 голосов
/ 04 мая 2009

Я бы просто пошел дальше и использовал символы, что-то вроде

Foo.status = :new

Это в основном неизменяемые строки, это означает, что независимо от того, сколько раз вы используете один и тот же символ в вашем коде, это все равно один объект в памяти:

>> :new.object_id
=> 33538
>> :new.object_id
=> 33538
>> "new".object_id
=> 9035250
>> "new".object_id
=> 9029510 # <- Different object_id
0 голосов
/ 04 мая 2009

Одним из способов может быть использование констант

module MyConstants
  New  = 1
  Used = 2
end

Тогда вы можете использовать их вот так

Foo.status = MyConstants::New

или даже так, если вы заботитесь о загрязнении пространства имен

include MyConstants
Foo.status = New

В другой мысли, может быть, вы хотите использовать конечный автомат .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...