Как хранить страны как целые числа в базе данных в ruby ​​на рельсах - PullRequest
1 голос
/ 29 января 2012

Что я пытаюсь сделать:

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

Возможное решение:

Один способ, которым я думаю, это может быть сделано, если я установлю гем как плагин и отредактирую массив стран, чтобы массивы в основном массиве были целыми числами и строкой, например. СТРАНЫ = [["United Kingdom", 1], ["United States", 2]]

Таким образом, в моей форме будут значения, представляющие строки. Тогда в моей таблице профилей может быть столбец country_id, в котором будет храниться идентификатор выбранных стран. У меня будет отдельная таблица «страны», в которой будут храниться страны, и я буду использовать country_id таблицы профилей для ссылки на правильную страну в таблице стран.

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

Это займет много времени, но это может сработать. Если бы я выбрал это решение, куда бы я поместил плагин? папка vendors в каталоге моих приложений, верно?

Но если есть более быстрый способ сделать это, я бы хотел сделать это таким образом.

Большее изображение:

Хорошо. У меня есть форма поиска, где пользователь может просматривать сайты, отфильтровывая результаты по:

текстовое местоположение Пол сексуальность семейное положение страна

Я использую мышление sphinx, и при фильтрации атрибутов кажется, что атрибуты должны быть представлены целыми числами, потому что все работает, кроме страны.

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

Я бы хотел, чтобы он хранил целые числа.

Вот некоторые константы, которые я использую в своих формах поиска:

module ApplicationHelper

    GENDER            = [["Select", nil],["Male", 1],["Female", 2]]

    ETHNICITY         = [["Select", nil],['Black', 1 ],['White / Caucasian', 2 ],['European', 3 ],['Asian', 4 ],
                         ['Indian', 5 ],['Middle Eastern', 6 ],['Native American', 7 ],['Hispanic', 8 ],
                         ['Mixed Race', 9 ],['Other Ethnicity', 10 ]]

    MARITAL_STATUS    = [[' Select', nil],['Single', 1 ],['Dating', 2 ],['In relationship', 3 ],['Married', 4 ],
                         ['Living Together', 5 ],['Divorced', 6 ],['Separated', 7 ],['Widowed', 8 ]]

    SEXUAL_PREFERENCE = [[' Select', nil],['Straight', 1 ],['Gay', 2 ],['Bi-sexual', 3 ]]

end

Форма поиска / просмотра:

<%= form_tag browsers_path, :method => 'get' do %>
  <p>
    Location: <%= text_field_tag :location, params[:location] %>
<br />
    Country: <%= country_select :country, [ "United Kingdom", "France", "Germany" ] %>
<br />
    Gender: <%= select_tag :gender, options_for_select(ApplicationHelper::GENDER, params[:gender]) %>
<br />
    Ethnicity: <%= select_tag :ethnicity, options_for_select(ApplicationHelper::ETHNICITY, params[:ethnicity]) %>
<br />

    Marital status: <%= select_tag :marital_status, options_for_select(ApplicationHelper::MARITAL_STATUS, params[:marital_status]) %>
<br />
    Sexual preference: <%= select_tag :sexual_preference, options_for_select(ApplicationHelper::SEXUAL_PREFERENCE, params[:sexual_preference]) %>
<br />
    <%= submit_tag "Search", :name => nil %>
  </p>
  <% end %>

Как вы можете видеть, каждый массив имеет строку и целое число. Если вы извлечете массив из гема country_select, то там будут только строки.

Буду признателен за объяснение наилучшего способа сделать то, что я пытаюсь сделать, и, если возможно, наглядный пример.

Надеюсь, этот пост имел смысл.

С уважением

Ответы [ 2 ]

1 голос
/ 31 января 2012

Я закончил воссозданием списка стран из википедии с названием страны и ISO-кодом в качестве значения.Гораздо проще, и я стал хранить страны в виде их iso-кода и целых чисел, что позволило использовать атрибут с мыслящим сфинксом.

0 голосов
/ 29 января 2012

Создайте постоянную, как у вас для других фильтров. Затем используйте виртуальный атрибут для перевода и установки значений, чтобы вы могли хранить версию int, а не строку.

EDIT:

Может быть, я не совсем понимаю, о чем мы говорим, но если вы пытаетесь сохранить значение в модели где-нибудь, вы можете сделать что-то вроде этого:

def country_int(country_s)
  country = COUNTRY[country_s]
end

def country_int
  COUNTRY.key(country)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...