Где вы обычно храните типы в рельсах? - PullRequest
3 голосов
/ 03 июля 2010

Это не сообщение в блоге, это вопрос!
Говоря о типах, я имею в виду, что у нас есть значение типа и описание типа.У нас могут быть разные типы (пол, размер, цвет и т. Д.) И набор значений для каждого типа.У нас есть 2 варианта: хранить типы в базе данных или в приложении.
Для меня, чтобы хранить всю таблицу для хранения значений типов для каждого типа, излишне.Другой способ - хранить типы в одной таблице с полями: имя типа, значение типа, описание типа.Сохранить тип в db полезно, если вы хотите изменить его значения из приложения.Но в основном, когда я добавляю новый тип, я меняю поведение приложения.
Для меня лучшим выбором является сохранение типов в приложении.У меня есть файл конфигурации YML, подобный этому (на самом деле он является частью SettingsLogic файла настроек):

types:
  gender: "male female"

Таким образом, я могу проверить ввод данных формы:

validates_inclusion_of :gender, :in => Settings.types.gender.split(/\s/)

Поскольку мое приложение многоязычное, я храню описания в файлах локализации:

ru:  
  types:
    gender: 
      male: "Мужской"
      female: "Женский"

Чтобы подготовить набор вариантов для выбора, я использую этот вспомогательный метод:

def genders
  genders = []
  Settings.types.gender.split(/\s/).each do |gender|
    genders << [t("types.gender.#{gender}"), gender]
  end
  genders
end

Недостаток этого подхода заключается в том, что я должен хранить в значениях типа db long мужской и женский вместо достаточных m и f .
Итак, я думаю о хэше:

def genders
  genders = []
  gender_types = { :m => "male", :f => "female" }
  gender_types.each do |key, value|
    genders << [t("types.gender.#{value}"), key]
  end
  genders
end

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

Итак, вопрос достаточно широк: как вы храните типы?Какой подход лучше или лучше?

1 Ответ

3 голосов
/ 03 июля 2010

Я делаю что-то подобное, используя хэши:

class RealtyRequest < ActiveRecord::Base
   TYPOLOGY = { 'One' => 1, 'Two' => 2, 'Three' => 3 }

   def typology
     TYPOLOGY.invert[typology_id]
   end
 end

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

При использовании коллекцийдля выбора можно использовать хеш:

<div class="field">
  <%= f.label :typology_id %><br />
  <%= f.select :typology_id, RealtyRequest::TYPOLOGY %>
</div>

cheers,

a.

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