我需要在数据库中保存某个参数。我们假设在线订单的付款方式。
模型/ order.rb
PAYMENT_TYPES = [ "Check", "Credit card", "Purchase order" ]
validates :pay_type, inclusion: PAYMENT_TYPES
视图/命令/ _form.rb
f.select :pay_type, Order::PAYMENT_TYPES, prompt: 'Select a payment method'
问题1 :使用简单数组PAYMENT_TYPES = [ "Check", "Credit card", "Purchase order" ]
与具有键/值对PAYMENT_TYPES = [ ["Check", 1], ["Credit card", 2], ["Purchase order", 3] ]
的数组有什么优缺点?
问题2 :如果我知道将来会有任何变化(包括更改姓名和组合类别),我应该使用哪一个?数据库值是数字还是文本字符串实际上是否重要?有什么实际区别?
问题3 :我应该使用上面的字符串还是应该使用:符号?如果:符号更好,那么如何使原始字符串可供查看?像PAYMENT_TYPES = [ [:check, "Check"]]
这样的东西?我可以使用:具有数字值的符号并且仍然可以使用字符串文本吗?我很困惑。
答案 0 :(得分:2)
如果您有购买交易表,并且每条记录都有“购买类型”属性(“支票”,“信用卡”或“采购订单”),我可能会有purchase_types
数据库中的表而不是编写表:
purchase_type_id (int) purchase_type_name (string)
-----------------------------------------------------
1 Cash
2 Credit Card
3 Purchase Order
这会将数据放在数据所在的位置:数据库中更容易管理,而不是在源代码中进行硬编码。它更容易修改。 (您可能希望稍后添加“Paypal”... :))它还为您提供两全其美:您的购买表更紧凑(没有冗余的字符串属性条目,因为它使用purchase_type_id
)和数据库是自包含的(id的含义在数据中,而不在代码中)。
然后,购买项目的选择器将使用此表格来选择选择框。这是一种常见的Rails模式。
在关于符号的新问题中,您可以在Ruby中轻松地在符号和字符串之间进行转换,因此例如["Check", :check]
是多余的。但如果你使用purchase_types
表,这是一个没有实际意义的点。
答案 1 :(得分:1)
我不知道你将如何使用第二个选项中子数组中的数字,但很明显使用第二个选项没有意义。
(i)如果要将数组中的项目与唯一编号相关联,可以在第一个选项中使用数组索引,这会使第二个选项中的数字变为冗余。
(ii)此外,如果你有一个扁平数组而不是嵌套数组,那么在数组中查找元素会更容易。
(iii)最后,出于维护原因,第一种选择明显优越;如果你碰巧在数组中添加/删除/更改项目,你仍然可以确保在第一个选项中有一个唯一的连续编号,但在第二个选项中,你必须重新编号。