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中的增删改查的更多相关文章

  1. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  2. winform窗体(六)——DataGridView控件及通过此控件中实现增删改查

    DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定:    List<xxx> list = new List<xxx> ...

  3. Winform(DataGridView)控件及通过此控件中实现增删改查

    DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定:    List<xxx> list = new List<xxx> ...

  4. DataGridView中进行增删改查

    首先我们需要知道是在哪个数据库中的哪个表进行增删改查: 这就需要我们: 建立给连接服务器的类:(可以在方法类中建立) 建立一个对列名进行封装的类:方便数据之间的传接:(学到Linq-sql时这些就简便 ...

  5. SQLite中的增删改查

    虽然android提供了sql查询的封装方法,但是理解起来还是麻烦,所以我这里用sql语句来完成工作. 首先是建立一个类,继承SQLiteOpenHelper 这里面会建立一个数据库,并且初始化一个表 ...

  6. “造轮运动”之 ORM框架系列(一)~谈谈我在实际业务中的增删改查

    想想毕业已经快一年了,也就是大约两年以前,怀着满腔的热血正式跨入程序员的世界,那时候的自己想象着所热爱的技术生涯会是多么的丰富多彩,每天可以与大佬们坐在一起讨论解决各种牛逼的技术问题,喝着咖啡,翘着二 ...

  7. (转)MySql中监视增删改查和查看日志记录

    转载地址为:http://blog.51cto.com/hades02/1641652 首先在命令行输入 show global variables like '%general%' ,然后出现下面的 ...

  8. mybatis中的增删改查操作

    在这一个部分,主要进行增删改查的示例书写. 增删改查可以基于xml的,也可以基于注解的方式. 一:对单条数据的查询 1.目录结构 这个使得目录更加清晰 2.User.java 这个使用以前的user表 ...

  9. 白话$resource,$resource中的增删改查

    前言 $resource详解,在学习angular的过程中,我们已经知道,$http能十分便捷的为我们实现与后端的数据交互,格式如下: $http({method:'GET'},url:'XX').t ...

随机推荐

  1. Type conversions in C++类型转换

    ###Implicit conversions隐式转换* 可以在基本类型之间自由转换:* 可以把任何类型的pointer转换为void pointer:* 可以将子类pointer转换为基类point ...

  2. Jersey Client传递中文参数

    客户端需要客户端的包: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jerse ...

  3. 使用sos查看.NET对象内存布局

    前面我们图解了.NET里各种对象的内存布局,我们再来从调试器和clr源码的角度来看一下对象的内存布局.我写了一个测试程序来加深对.net对象内存布局的了解: using System; using S ...

  4. gdb用法

    mickole@test:~/ctest/05gdb$ gdb simple //开始gdb调试 GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4- ...

  5. ASP.NET Core 2 学习笔记(七)路由

    ASP.NET Core通过路由(Routing)设定,将定义的URL规则找到相对应行为:当使用者Request的URL满足特定规则条件时,则自动对应到相符合的行为处理.从ASP.NET就已经存在的架 ...

  6. Android UI/UX 工具

    Zeplin 用于界面图片自动导出. 图标 : https://material.io/icons/

  7. 数据库的完整性约束(ForeignKey ,Unique)

    文字转自于 海燕.博客 一.介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 ...

  8. python web开发c6——阿里云上ubuntu+flask+gunicorn+nginx服务器部署(一)简单测试

    简述 Nginx在服务器部署中的作用 请求通过Nginx实现反向代理,将请求提交给代理服务器.本文中只用了一台服务器,所以是代理到本机. gunicorn的作用 作为服务器代码的容器.接收Nginx的 ...

  9. Spring配置项<context:annotation-config>的解释说明

    今天在闲逛CSDN论坛时,看到一位博主写的一篇关于<Spring中IOC的Annotation的实现>的文章, 于是点击进去看了下, 发现在说明中对Spring配置文件中的有些配置节点模凌 ...

  10. webpack快速入门——给webpack增加babel支持

    1.Babel的安装与配置 Babel其实是几个模块化的包,其核心功能位于称为babel-core的npm包中,webpack可以把其不同的包整合在一起使用,对于每一个 你需要的功能或拓展,你都需要安 ...