Rails 3 сохраняет несколько (постоянных) значений выбора флажка в столбце Single DB - PullRequest
0 голосов
/ 19 марта 2012

У меня есть константа с именем PAYMENT_METHODS в venue.rb.

PAYMENT_METHODS = {'Visa' => 1, 'MasterCard' => 2, 'American Express' => 3, 'Diners' => 4, 'JCB' => 5, 'Bankomat' => 6, 'sodexo' => 7, 'MA-Gutscheine' => 8 }

Вы можете отмечать / снимать отметки с нескольких типов платежей в форме (payment_options - строка):

<%= hidden_field_tag "venue[payment_options][]", nil %>
<% Venue::PAYMENT_METHODS.each do |key, value| %>
  <%= f.check_box :payment_options, {:multiple => true}, value %>
  <%= label_tag key %>
<% end %>

Теперь я хочу сохранить значения в одном столбце базы данных payment_options, например. [1,3,5]. Независимо от того, что я проверяю, всегда сохраняется 0. Что я делаю неправильно? Я использую PostgreSQL.

Заранее спасибо

1 Ответ

2 голосов
/ 19 марта 2012

У вас есть несколько вариантов здесь.

Строковый столбец

Сериализуйте это в строку и сохраните в столбце VARCHAR.Есть много способов.

Примеры:

update orders set payment_options = '1,2,3'; -- comma separated list    
update orders set payment_options = '{"visa": 1, "amex": 1}'; -- json object

Целочисленный столбец

Сохранять выбранные значения в виде битов в одном столбце типа int.

Пример:

VISA = 0x01
MASTERCARD = 0x02
AMEX = 0x04
DINERS = 0x08

update order set payment_options = #{VISA | MASTERCARD}; -- int value 3
update order set payment_options = #{MASTERCARD | DINERS}; -- int value 10

Затем вы можете проверить значение следующим образом

def visa?
  (payment_options & VISA) == VISA
end

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

Столбец массива

Очевидно, в PostgreSQL есть массивы, но я не очень много знаю об этой БД.Два предыдущих варианта являются универсальными и работают в любой базе данных.

Отношение «многие ко многим»

Это было рассмотрено миллион раз.Ключевые слова:

has_and_belongs_to_many
has_many :through
...