Rails中的增删改查
1. rails中类与对象与SQL中表与行的关系
rails中提供了对象关系映射(ORM),将模型类映射至表,模型类的关联表名是类名小写后的复数形式,如类名Order,对应的表名为orders;若类名包含多个大写单词,则应在单词之间使用下划线划分表名,如类名为TaxAgency,对应的表名为taxagencies。
rails中将模型类的对象对应于表中的行,对象的属性对应于表中的字段。
例:
Sql代码
createtable users(
id int auto_increment primary key,
username varchar(20),
password varchar(20)
);
在model目录下创建user.rb,内容如下
Ruby代码
classUser < ActiveRecord::Base
end
这样就为表与User类建立起了映射关系。其中表的username对应User类的username属性,表的其他字段也同样在User中作为其对象属性。
2. 查询字段名清单,查询字段的详细信息
User.column_names # [“id”, “username”, “password”, ”creat_at”,“update_at”]
注:Active Record提供了一些附加字段,如
creat_at:行记录创建的时间
update_at:行记录更新的时间
creat_on:行记录创建的日期
update_on:行记录更新的日期)
type:查询每一行属于哪个子类
id:主键字段的默认名
User.column_hash[“username”] # @sql_type=” varchar(20)”,@null=true,等
3. 更改主键名
class Order < ActiveRecord::Base
self.primary_key= “num”
end
例:
ord = Order.new
ord.id = 1
ord.username = “tom”
ord.password = “tom”
ord.save #作更改之后需要save一下,才能保证表中的行与对象同步
ord =Order.find(1) #通过id进行查找,返回匹配的行,若不存在,返回nil
ord.username #tom
ord.attributes #{“num” => ”1”, “username”=>”tom”, “password”=>”tom”}
注:若两个模型对象是同一个类的实例,且具有相同的主键,rails认为其相等(==)。
4. 模型之间的关联性
1) 一对一关联(一对零或一对一)
指通过一个表中的任何一行的外键引用到另一个表中最多一行的记录,如每个位子最多坐一个人
class Person < ActiveRecord::Base
belongs_to:chair
end
class Chair < ActiveRecord::Base
has_one:person
end
2) 一对多关联
如一个书柜可以放很多书
class Book <ActiveRecord::Base
belongs_to :bookcase
end
class BookCase< ActiveRecord::Base
has_many:books
end
3) 多对多关联
如一本书可以属于多个类别,每个类别可以包含多本书
class Book < ActiveRecord::Base
has_and_belongs_many:categories
end
classCategory < ActiveRecord::Base
has_and_belongs_many:books
end
rails使用中间连接表来实现多对多关联,中间连接表包含连接两个目标表的外键,表名为表1_表2,如categories_books.
5. 创建新的行记录
1) new 创建实例模型对象
(必须调用save,将内容存至数据库,否则数据只存在于本地计算机)
a) ord = Order.new
ord.id = 1
ord.username = “tom”
ord.password = “tom”
ord.save
b) Order.new do | ord |
ord.id =1
ord.username= “tom”
ord.password= “tom”
ord.save
end
c) ord = Order.new(
:id => 1,
:username => “tom”,
:passname => “tom”)
ord.save
2) create 创建实例模型对象的同时将其存储到数据库中
a) ord = Order. create(
:id => 1,
:username => “tom”,
:passname => “tom”)
b) ord = Order. create(
[{:id => 1,
:username => “tom”,
:passname => “tom”},
{:id =>2,
:username => “lili”,
:passname => “;lili”}]) #同时创建多行记录
6. 查询
1) find(一个或多个主键)
若只有一个主键,则返回包含相应行记录数据的一个对象或是抛出RecordNotFound异常;若包含多个主键,则返回相应对象的数组,若有1个未找到,仍抛出异常。
例:
an_order = Order.find(1) #返回id=1的对象
2) find_by_(find_first_by)、find_last_by_、find_all_by_
Order.find_by_id(num) #查找第一个id=num的对象,不存在时返回nil
Order.find_by_id!(num) #查找第一个id=num的对象,不存在时抛出
RecordNotFound异常
Order.find_last_by_id(num) #查找最后一个id=num的对象,不存在时返回nil
Order.find_last_by_id!(num) #查找最后一个id=num的对象,不存在时抛出
RecordNotFound异常
Order.find_all_by_id(num) #查找所有的id=num的对象,以数组的形式返回,不
存在时返回nil
Order.find_all_by_id!(num) #查找所有的id=num的对象,以数组的形式返回,
不存在时抛出RecordNotFound异常
id处可以是类属性中的任意一个,也可多个属性同时查询,如
find_by_id_and_password(num, pw)
3) where
如:
Order.where(:id=>1, :username => “tom”)
Order.where(“ id=1 and username=’tom’ ”)
username =params[:username]
Order.where(“ id=1 and username=’#{ username }’ ”)
Order.where([“ id=1 and username=? ”, username])
Order.where(“ id=1 and username=:username ”, { :username => username})
Order.where(“ id=:id and username=:username ”, params[:order])
Order.where(id= params[:id], username= params[:username])
Order.where(“ username like ? ”, params[:username]+%)
7. 返回记录的子集
1) order
Order.where(:username => “tom”).order(“id”) #查出username为tom的对象,并按
id的升序排列
2) limit
Order.where(:username => “tom”).order(“id”).limit(5)
#查出username为tom的对象,并按id的升序排列返回前5个
3) offset
#指定第一行的偏移量
4) first
Order.where(:username => “tom”).order(“id”).first
#查出username为tom的对象,并按id的升序排列,返回第一个对象
8. select、group方法
Order. select(“id”, ”username”)
Order. select(“id”, ”username”).where(“password =”pw””)
Order. select(“id”, ”username”) .where(“password =”pw””).group(”username”)
9. 统计函数
average(字段名):求平均值
maximum:最大值
minimum:最小值
sum:求和
count:计数
10. 执行sql语句
find_by_sql(sql语句)
11. attributes、attribute_names、attribute_present?
attributes:返回属性名/值对的hash对象
attribute_names:返回name属性值组成的数组
attribute_present?:检验某个属性是否有效
例:
orders = Order.find_by_sql(“select id, username from ord”)
first = orders[0]
first. attributes # {“id”=>1, “username”=>”tom”, “password”=>”tom”}
first. attribute_names # [“id”, “username”, “password”]
first. attribute_present?(“press”) #false
12. 更新现有行
1) save、save!
ord = Order.find(1)
ord.username = “Tom”
ord.save
save若保存成功返回true,否则返回nil
save!若保存成功返回true,否则返回异常
2) update_attribute
ord = Order.find(1)
ord. update_attribute(:username, “Tom”)
ord. update_attribute(:username=> “Tom”, :password=>”psp”)
3) update
Order.update(1, :username=> “Tom”, :password=>”psp” )
4) update_all
Order.update_all (“password=psp” )
13. 删除行记录
1) delete
ord.delete(1) #删除id为1的记录
2) delete_all
ord. delete_all([“username=’tom’”]) #删除给定条件的记录
3) destroy
ord.destory
delete方法绕过了ActiveRecord模块的各种回调和验证函数,而destory方法确保了调用他们的所有的一切过程。
Rails中的增删改查的更多相关文章
- 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查
原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...
- winform窗体(六)——DataGridView控件及通过此控件中实现增删改查
DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定: List<xxx> list = new List<xxx> ...
- Winform(DataGridView)控件及通过此控件中实现增删改查
DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定: List<xxx> list = new List<xxx> ...
- DataGridView中进行增删改查
首先我们需要知道是在哪个数据库中的哪个表进行增删改查: 这就需要我们: 建立给连接服务器的类:(可以在方法类中建立) 建立一个对列名进行封装的类:方便数据之间的传接:(学到Linq-sql时这些就简便 ...
- SQLite中的增删改查
虽然android提供了sql查询的封装方法,但是理解起来还是麻烦,所以我这里用sql语句来完成工作. 首先是建立一个类,继承SQLiteOpenHelper 这里面会建立一个数据库,并且初始化一个表 ...
- “造轮运动”之 ORM框架系列(一)~谈谈我在实际业务中的增删改查
想想毕业已经快一年了,也就是大约两年以前,怀着满腔的热血正式跨入程序员的世界,那时候的自己想象着所热爱的技术生涯会是多么的丰富多彩,每天可以与大佬们坐在一起讨论解决各种牛逼的技术问题,喝着咖啡,翘着二 ...
- (转)MySql中监视增删改查和查看日志记录
转载地址为:http://blog.51cto.com/hades02/1641652 首先在命令行输入 show global variables like '%general%' ,然后出现下面的 ...
- mybatis中的增删改查操作
在这一个部分,主要进行增删改查的示例书写. 增删改查可以基于xml的,也可以基于注解的方式. 一:对单条数据的查询 1.目录结构 这个使得目录更加清晰 2.User.java 这个使用以前的user表 ...
- 白话$resource,$resource中的增删改查
前言 $resource详解,在学习angular的过程中,我们已经知道,$http能十分便捷的为我们实现与后端的数据交互,格式如下: $http({method:'GET'},url:'XX').t ...
随机推荐
- 11i AP & GL 月末对账时常用系统报表
11i AP & GL 月末对账时常用系统报表 http://www.cnblogs.com/benio/archive/2011/10/14/2212169.html AP: 1.Invo ...
- Unity Shader序列帧动画学习笔记
Unity Shader序列帧动画学习笔记 关于无限播放序列帧动画的一点问题 在学shader的序列帧动画时,书上写了这样一段代码: fixed4 frag(v2f i){ // 获得整数时间 flo ...
- c#字典怎么获取第一个键值 List<对象>获取重复项,转成Dictionary<key,List<对象>>
c#字典怎么获取第一个键值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictio ...
- C# 多线程 弹出模态MessageBox的一种方法
在多线程中,有时候使用MessageBox.Show方法弹出对话框,弹出的Messagebox不是模态的,不能满足我的要求.经过研究,如下实现 private void button1_Click(o ...
- javar入门——基本数据类型
Java中的数据类型分为两类: 基本数据类型(或者称为原生数据类型) 引用数据类型 基本数据类型 8种:6种基本数据类型,1种字符型,1种布尔型 byte,short,int,long,float,d ...
- CodeChef TWOROADS(计算几何+拉格朗日乘数法)
题面 传送门 简要题意:给出\(n\)个点,请求出两条直线,并最小化每个点到离它最近的那条直线的距离的平方和,\(n\leq 100\) orz Shinbokuow 前置芝士 给出\(n\)个点,请 ...
- jQuery基础笔记 each和data(7)
day56 参考:https://www.cnblogs.com/liwenzhou/p/8178806.html#autoid-1-11-0 each jQuery.each(collection, ...
- 图片后门恶意捆绑工具FackImageexploer
本文作者:夜莺 今天向大家提个醒,最近有一款工具名叫FackImageexploer,该工具能够将恶意的.bat和.exe程序与图片绑定在一起,假若受害者点击了图片,就会反弹个shell给不法分子,如 ...
- 完整的REM布局的工作流程与规范
rem从去年的手淘双11开始火起来之后一直就想去使用,但是苦于学习途径有限,工作任务也比较繁忙导致一度延后. 那么现在对相关知识的学习与初步的项目实践之后,在这里记录一下使用rem解决各屏幕适配问题. ...
- centos 安装oracle 11g r2(二)-----监听配置与创建数据库实例
centos 安装oracle 11g r2(二)-----监听配置与创建数据库实例 一.监听配置(命令:netca) 1.以 oracle 用户输入命令,启动图形化工具配置监听 [oracle@lo ...