【问题标题】:Rails 3 save multiple (constant) values of a checkbox selection to Single DB ColumnRails 3将复选框选择的多个(常量)值保存到Single DB Column
【发布时间】:2012-03-19 11:14:43
【问题描述】:

我在venue.rb 中有一个名为PAYMENT_METHODS 的常量。

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

提前致谢

【问题讨论】:

  • 您尝试将字符串保存到 int 列?

标签: ruby ruby-on-rails-3 activerecord serialization constants


【解决方案1】:

这里有几个选项。

字符串列

将此序列化为字符串并保存到 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

标志和按位运算对您来说可能有点困难,如果您从未使用过它们。逗号分隔的列表可能是最简单的选择。

数组列

显然,there are arrays in PostgreSQL,但我对这个数据库了解不多。之前的两个选项是通用的,适用于任何数据库。

多对多关系

这已经被报道了无数次。关键词:

has_and_belongs_to_many
has_many :through

【讨论】:

  • 谢谢!一个普遍的问题:您认为这是存储付款类型的正确方法吗?我还考虑过PaymentTypemodel 和has_many_and_belongs_to_manyrelationship,但我认为这太过分了......
  • 取决于您将如何使用它。据我了解你的意图,是的,这将是一个矫枉过正。
猜你喜欢
  • 2011-04-10
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2021-12-07
  • 2016-11-12
  • 1970-01-01
相关资源
最近更新 更多