Рекомендации по преобразованию столбца с целочисленным значением в строковое представление - PullRequest
3 голосов
/ 22 декабря 2008

Допустим, у вас есть модель, подобная следующей:

class Stock < ActiveRecord::Base
  # Positions
  BUY = 1
  SELL = 2
end

И в этом классе в качестве атрибута целого типа с именем 'position', который может содержать любое из вышеуказанных значений. Какова лучшая практика Rails для преобразования этих целочисленных значений в удобочитаемые строки?

a) Используйте вспомогательный метод, но тогда вы должны убедиться, что вы поддерживаете вспомогательный метод и модель в синхронизации

def stock_position_to_s(position)
  case position
  when Stock::BUY
    'buy'
  when Stock::SELL
    'sell'
  end
  ''
end

b) Создайте метод в модели, который нарушает чистый подход MVC.

class Stock < ActiveRecord::Base
  def position_as_string
    ...snip
  end
end

в) Более новый способ использования нового материала I18N в Rails 2.2?

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

Спасибо, Kenny

Ответы [ 7 ]

3 голосов
/ 22 декабря 2008

Похоже на то, что относится к представлениям, так как это проблема презентации.

Если он широко используется, то во вспомогательном методе для СУХОГО использования и используйте I18N, если он вам нужен.

1 голос
/ 23 декабря 2008

Попробуйте что-то вроде этого

class Stock < ActiveRecord::Base
  @@positions => {"Buy" => 1, "Sell" => 2}
  cattr_reader :positions

  validates_inclusion_of :position,  :in => positions.values
end

Позволяет сохранить позицию в виде целого числа, а также легко использовать выбранные помощники.

Конечно, представления все еще являются проблемой. Вы можете использовать помощников или создать position_name для этой цели метод

class Stock < ActiveRecord::Base
  @@positions => {"Buy" => 1, "Sell" => 2}
  cattr_reader :positions

  validates_inclusion_of :position,  :in => positions.values

  def position_name
    positions.index(position)
  end
end
0 голосов
/ 28 марта 2009

Я написал плагин, который может помочь некоторое время назад. Смотрите это . Это позволяет вам определять списки и дает вам хорошие методы, заканчивающиеся на _str для целей отображения.

0 голосов
/ 23 декабря 2008

@ Дерек П. Это реализация, с которой я впервые столкнулся, и, хотя она определенно работает, она как бы ломает метафору MVC, потому что модель теперь имеет представление связанной информации, определенной в своем классе. Струны в контроллерах - это одно, но строки в моделях (на мой взгляд) явно противоречат духу чистого MVC.

Это также не работает, если вы хотите начать локализацию, поэтому, хотя это был метод, который я использовал изначально, я не думаю, что это метод для будущего развития (и определенно не в мире I18N.)

Спасибо за ввод.

С уважением, Kenny

0 голосов
/ 23 декабря 2008

Почему бы не использовать свойства собственной структуры данных? Пример:

класс Stock

Тогда вы можете получить их, используя Stock :: ACTIONS [1] # => 'buy' или Stock :: ACTIONS [2] # => 'sell'

или вы можете использовать хеш {: buy => 1,: sell => 2} и получить к нему доступ как Stock :: ACTIONS [: buy] # => 1

Вы поняли.

0 голосов
/ 23 декабря 2008

@ HermanD: я думаю, что гораздо лучше хранить значения в целочисленном столбце, а не в строковом столбце по многим причинам.

  1. Экономит пространство базы данных.
  2. Проще / быстрее индексировать целое число, чем строку.
  3. Ваше несложное кодирование удобочитаемой строки в качестве значений в базе данных. (Что произойдет, если клиент скажет, что «Покупка» должна стать «Покупкой»? Теперь пользовательский интерфейс отображает «Покупка» повсюду, но вам нужно продолжать устанавливать «Покупать» в базе данных.)

Итак, если вы храните определенные значения в базе данных в виде целых чисел, то в какой-то момент вам нужно будет показать их пользователю в виде строк, и я думаю, что единственный способ сделать это - программно.

Вы можете переместить эту информацию в другой объект, но, ИМХО, я бы сказал, что это излишнее. Затем вам нужно будет добавить еще одну таблицу базы данных. Добавьте еще один раздел «admin» для добавления, удаления и переименования этих значений и так далее. Не говоря уже о том, что если бы у вас было несколько столбцов, в разных моделях, которым требовалось такое поведение, вам нужно было бы либо создать множество таких объектов (например, stock_positions, stock_actions ,action_kinds и т. Д.), Либо вам пришлось бы разработать достаточно универсально использовать полиморфные ассоциации. Наконец, если название позиции жестко запрограммировано, вы теряете возможность легко локализовать его позднее.

@ frankodwyer: Я должен согласиться с тем, что использование вспомогательного метода, вероятно, лучший способ. Я надеялся, что это может быть «приятным» способом сделать это, но это не похоже на это. На данный момент, я думаю, лучший способ - это создать новый вспомогательный модуль, может быть, что-то вроде StringsHelper, и добавить в него кучу методов для преобразования констант модели в строки. Таким образом, я могу использовать весь материал I18N в помощнике, чтобы извлечь локализованную строку, если мне это понадобится в будущем. Раздражает то, что если кому-то нужно добавить новое значение в столбец моделей, ему также нужно будет добавить проверку для этого в помощнике. Не 100% СУХОЙ, но я думаю, "достаточно близко" ...

Спасибо вам обоим за вклад.

Kenny

0 голосов
/ 22 декабря 2008

Есть ли у приложения веская причина для программного преобразования целого числа в читаемую человеком строку?

Я бы сделал объекты позиций, которые имеют целочисленный атрибут позиции и атрибут имени.

Тогда вы можете просто сделать

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