http://api.rubyonrails.org/classes/ActiveRecord/Enum.html

新的项目中有一个字段是展示类型,可以用下拉框去做,用string存储具体的类型字段。

尝试了一下把展示类型修改为integer,用Rails enum枚举来做。

使用枚举(整型)来存储类似于下拉框选择的这类的值, 比起直接存储类型的字符串,能减少表中存储字段的大小。

建表语句如下

class CreateSubjects < ActiveRecord::Migration[5.0]
def change
create_table :subjects do |t|
t.string :title, limit: 40
t.string :sub_title, limit: 40
t.string :categories, limit: 30
t.string :description, limit: 500
t.integer :status, limit: 1
t.integer :type, limit: 1
t.integer :use_default_image, limit: 1
t.integer :has_ranking_list, limit: 1 t.timestamps
end
end
end

model中定义了enum的字段值。

class Subject < ApplicationRecord

  TYPES = [ :'变化标题描述', :'固定标题描述', :'播放器专题', :'无文案专题' ]
enum type: TYPES self.inheritance_column = '_disable'
end

在console里修改当前type的值,rails会自动显示成对应的字符串

[6] pry(main)> Subject.last.update_attribute :type, 2
Subject Load (0.2ms) SELECT `subjects`.* FROM `subjects` ORDER BY `subjects`.`id` DESC LIMIT 1
(0.2ms) BEGIN
SQL (0.4ms) UPDATE `subjects` SET `type` = 2, `updated_at` = '2016-09-13 06:06:49' WHERE `subjects`.`id` = 3
SQL (14.3ms) INSERT INTO `versions` (`item_type`, `item_id`, `event`, `object`, `created_at`, `object_changes`) VALUES ('Subject', 3, 'update', '{\"id\":3,\"title\":\"谢谢\",\"sub_title\":\"1\",\"categories\":\"1\",\"description\":\"1\",\"status\":null,\"type\":1,\"use_default_image\":1,\"has_ranking_list\":1,\"created_at\":\"2016-09-13T04:35:23.000Z\",\"updated_at\":\"2016-09-13T04:35:23.000Z\"}', '2016-09-13 06:06:49', '{\"type\":[1,2],\"updated_at\":[\"2016-09-13T04:35:23.000Z\",\"2016-09-13T06:06:49.000Z\"]}')
(54.0ms) COMMIT
=> true
[7] pry(main)> Subject.last
Subject Load (0.4ms) SELECT `subjects`.* FROM `subjects` ORDER BY `subjects`.`id` DESC LIMIT 1
=> #<Subject:0x00558622d04d98
id: 3,
title: "谢谢",
sub_title: "",
categories: "",
description: "",
status: nil,
type: "播放器专题",
use_default_image: 1,
has_ranking_list: 1,
created_at: Tue, 13 Sep 2016 12:35:23 CST +08:00,
updated_at: Tue, 13 Sep 2016 14:06:49 CST +08:00>

而直接查询mysql会发现,这个字段里存的是2.

$ bundle exec rails db -p
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 72
Server version: 5.5.47-0ubuntu0.14.04.1 (Ubuntu) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select * from subjects;
+----+--------+-----------+------------+-------------+--------+------+-------------------+------------------+---------------------+---------------------+
| id | title | sub_title | categories | description | status | type | use_default_image | has_ranking_list | created_at | updated_at |
+----+--------+-----------+------------+-------------+--------+------+-------------------+------------------+---------------------+---------------------+
| 3 | 谢谢 | 1 | 1 | 1 | NULL | 2 | 1 | 1 | 2016-09-13 04:35:23 | 2016-09-13 06:06:49 |
+----+--------+-----------+------------+-------------+--------+------+-------------------+------------------+---------------------+---------------------+
1 row in set (0.00 sec)

在_form中的代码如下

  <div class="form-group">
<%= f.label :type, class: 'col-sm-2 control-label' %> <div class="col-sm-4">
<%= f.select :type, Subject::TYPES %>
</div>
</div>

在index和show页面直接读取数据就ok了

<%= subject.type %>

rails enum用于存储数据的更多相关文章

  1. 1.搭建NFS环境,用于存储数据

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-06-12 14:59:50 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

  2. android开发中的5种存储数据方式

    数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...

  3. sharedPreferences存储数据

    sharedPreferences使用的是键值对的方式存储数据. 1.Android中三种获取sharedPreferences的方式 1)Context 类中的getSharedPreference ...

  4. [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据

    Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.那这个时候有读者就会提出问题,难道两个 ...

  5. ios NSUserDefaults存储数据(偏好设置)

    ios NSUserDefaults存储数据(偏好设置) 1.NSUserDefaults用于存储数据量小的数据,主要是用户配置,但也可以支持存储一些小数据包括:NSString, NSNumber, ...

  6. Python JSON存储数据

    前言: 很多程序都要求用户输入某种信息,如让用户存储游戏首选项或提供要可视化的数据.不管专注的是什么,程序都把用户提供的信息存储在列表和字典等数据结构中.用户关闭 程序时,你几乎总是要保存他们提供的信 ...

  7. Numpy用于数组数据的存储和读取

    Python的Numpy模块可用于存储和读取数据: 1.将一个数组存储为二进制文件 Numpy.save:将一个数组以.npy的格式保存为二进制文件 调用格式:numpy.save(file, arr ...

  8. int float 的具体的取值范围取决于具体的机器 整数除法舍位 整形(int)也可以用于存储字符型数据

    int  通常为16位  存储单元 float  通常为32位 取决于具体的机器 #include main() { int fathr,celsius; int lower,upper,step; ...

  9. Fresco源码解析 - DataSource怎样存储数据

    Fresco源码解析 - DataSource怎样存储数据 datasource是一个独立的 package,与FB导入的guava包都在同一个工程内 - fbcore. datasource的类关系 ...

随机推荐

  1. mysql apach php

    一.MySql MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将 ...

  2. SharePoint 2013常用开发工具分享

    众所周知,一款好的开发工具不仅能提高项目开发效率,而且能够协助开发人员简化开发流程.本文汇总几款SharePoint 2013开发常用开发工具,希望能够对大家有所帮助.如果您有更好的工具,没有包含在本 ...

  3. linux ubuntu14 更改为root用户登录

    设置使用root用户登陆首先要修改root的登陆密码sudo passwd root1.输入sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu ...

  4. android开发环境搭建(ubuntu15.04+jdk8+eclipse+android sdk)

    开始学习android开发,首先对其环境对搭建比较重要.平台可以选择window/linux/mac等,这里,我选择ubuntu系统,方法比较原始,当然也可以直接用google提供的android s ...

  5. 利用百度API Store接口进行火车票查询

    火车票查询 项目源码下载链接: Github:https://github.com/VincentWYJ/TrainTicketQuery 博客文件:http://files.cnblogs.com/ ...

  6. RapidJSON 代码剖析(一):混合任意类型的堆栈

    大家好,这个专栏会分析 RapidJSON (中文使用手册)中一些有趣的 C++ 代码,希望对读者有所裨益. C++ 语法解说 我们先来看一行代码(document.h): bool StartArr ...

  7. RGW 负载均衡和高可用的几个方案对比

    注:在RGW网关主机网卡已经是10Gb的情况下,如下三个方案没有引入LVS:如果RGW是Gb网卡,可以考虑引入LVS做流量负载均衡. RGW部署采用 fastcgi+nginx 扩展性和可配置性更强. ...

  8. 更好的pip工作流

    转自:http://codingpy.com/article/a-better-pip-workflow-recommended-by-kenneth/ 现在大家开发Python应用时,在代码库的根目 ...

  9. 图解Javascript原型链

    本文尝试阐述Js中原型(prototype).原型链(prototype chain)等概念及其作用机制.上一篇文章(图解Javascript上下文与作用域)介绍了Js中变量作用域的相关概念,实际上关 ...

  10. angularJs模块ui-router之路由控制

    在你的应用中大多数状态都有与其相关联的 url,路由控制不是设计完成 state 之后的事后想法,而是开始开发时就应该考虑的问题. 这里是如何设置一个基本url. $stateProvider .st ...