Rails 中的持久化框架 Active recored

来源:互联网 发布:传奇霸业翅膀升级数据 编辑:程序博客网 时间:2024/05/01 10:23

Active Recored  基本的数据查询

Active Recored rails的核心组件 是标准的orm 框架相当于javahibernate 一样。封装了对数据的crud 。常见的创建对象方法采用的new  activerecord MVC中的M用来处理数据和业务逻辑。项目中被用作ORM框架。在activerecord中是多约定少配置的原则。activerecord使用一些命名约定,查找模型或数据表之间的映射关系。类名为单数,对应的数据表就是复数,当类名为多个字段时采用驼峰命名,对应数据库表将使用下划线分隔各单词。创建activerecored模型的过程很简单,只需要继承ActiveRecord::Base类就行例子:

class Product< ActiveRecord::Base

                      end

 该代码会创建Product 模型,对应于数据库中的products  同时product 表中的字段也映射到了Product模型实例的属性上。

不使用默认的命名约定

使用ActiveRecord::Base.table_name= 该方法可以指定数据表的名字

 例子:class Product < ActiveRecord::Base

                    self.table_name=“product”

     

              end

1.数据的创建

通过new对象的方法,然后用对象调用字段的方法为其赋值,最后执行save()方法保存即可。或者直接调用create方法如:

1. User.create(:username=>'yea',:password=>'123456')  

2. #或者传递一个Hash数组  

3. User.create([{:username=>'name1',:password=>'123'},{:username=>'name2',:password=>'456'}])  

4. #两种方式创建后都可以传递对象到一个代码块   

5. #User.create(:username=>'yee') do |u|  

6. u.password='123456'  

7. end  

2.数据的读取

1. #根据主键查找记录  

2. User.find(1)  

3. #根据主键数组,查找数据。返回一个数组  

4. User.find(1,2,3) 或者User.find([1,2,3])  

5. #以上查询如果没有记录则会抛出RecordNotFound的异常  

#其他查询方法,使用例子如下  

6.   # find first  

7.   Person.find(:first# returns the first object fetched by SELECT * FROM people  

8.   Person.find(:first:conditions => [ "user_name = ?", user_name])  

9.   Person.find(:first:conditions => [ "user_name = :u", { :u => user_name }])  

10.   Person.find(:first:order => "created_on DESC":offset => 5)  

  # find last  

11.   Person.find(:last# returns the last object fetched by SELECT * FROM people  

12.   Person.find(:last:conditions => [ "user_name = ?", user_name])  

13.   Person.find(:last:order => "created_on DESC":offset => 5)  

  # find all  

14.   Person.find(:all# returns an array of objects for all the rows fetched by SELECT * FROM people  

15.   Person.find(:all:conditions => [ "category IN (?)", categories], :limit => 50)  

16.   Person.find(:all:conditions => { :friends => ["Bob""Steve""Fred"] }  

17.   Person.find(:all:offset => 10, :limit => 10)  

18.   Person.find(:all:include => [ :account:friends ])  

19.   Person.find(:all:group => "category")  

 

:conditions参数类似于SQL中的WHERE子句,指定查询中的条件。

:order 对返回的结果排序,类似于SQL中的ORDER BY

:group 分组,类似SQL中的 GROUP BY

:limit 指定返回结果的行数

:offset 指定结果的偏移量,表示从第几条符合条件的记录开始

:joins 类似于LEFT JOIN之类的自子语句,详情参阅官方文档

:include 根据表之间的关联,在查询中自动加入LEFT OUTER JOIN的SQL语句,详情参阅官方文档

:select 返回的字段,以字符串形式表示,如"id,name"。默认为select * ...

:from SELECT语句from后面的表名,默认为当前模型对应的表,可根据需要指定其他的表或视图

:readonly 标记返回的记录为只读,不能再被更细或保存

:lock 如::lock=>true  一个排它锁,通常用于在生产的sql语句中包含 for update子句,这样只有在事务提交后,锁才会被释放。

 

Active Recored 提供个find_by_sql()方法中也可以直接书写sql 语句来执行相应的操作,也支持占位符参数传递。如:users = User.find_by_sql(['select * from users where username=?and password=?',username,password]) 

ActiveRecord还根据表的字段,动态生成了相应的查询简化相对应的查询方法如:

1. users = User.find_by_username('jack')  

2. users = User.find_by_password('123456')

 

更新数据  例如:

1. #给查询的对象重新赋值  

2. u = User.find(1)  

3. u.username = 'ttt'  

4. u.save  

5. #使用update_attribute()可以同时更新给定的特定字段的值,这种形式不再需要调用save方法  

6. u = User.find(1)  

7. u.update_attribute(:username=>'newname',:password=>'321654')  

8. #使用类方法,update()和update_all(),update的第一个参数为更新的id。  

9. User.update(1,:username=>'john',:password=>'123456')#更新ID为1的记录的username为john,password为123456  

10. User.update_all("password='123'","username like '%j%'")#更改所有用户中用户名包含j的密码为123  

 

删除数据:

1. #第一种,调用对象的destroy方法  

2. u = User.find(1)  

3. u.destroy  

4. #第二种,类方法delete()  

5. User.delete(1)  

6. User.delete([1,2,3])  

7. #第三种,类方法delete_all(),它类似于SQL语句中DELETE语句的where  

8. User.delete_all("username like '%j%'")  

表与表之间的关联关系 有三种,一对一,一对多,多对多

Active Recored 提供了四种方法来表示关联关系:has_one,has_many,belongs_to has_and_belongs_to_many

1.belongs_to

这个类方法表示从一个ActiveRecord对象到另外单个具有一个外键属性的被关联对象的关联方法。其选项有

:class_name 指定关联的类名,在关联名称不符合命名惯例的时候使用

:conditions 设置关联的约束条件

:foreign_key 指定用来查找关联对象的外键的列。一般情况下Rails会使用你所设的关联名称后面加_id的方法自动推算出外键的名称。

:counter_cache 这个选项让Rails自动更新被关联对象的从属对象数量。

:include 指定加载关联对象时同时要加载的关联对象,Rails会动态地在SELETE语句中加入必要的LEFT OUTER JOINS。

2.has_many

此关联允许你在一个数据模型中定义关联让他具有很多其他的附属的数据模型。选项有

:after_add 当一个记录通过<<方法被加入到集合中后会触发这个回调,但不会被集合的create方法触发。可以接受一个或多个方法名的符号或者Proc对象

:atfer_remove 当使用delete方法将一个记录从集合中移除时触发这个回调

:as指定被关联对象的多态belongs_to

:before_add 当一个记录通过<<方法被加入到集合之前触发这个回调,concat和push是<<的别名

:before_remove 当使用delete方法讲一个记录从集合中移除前触发回调

:class_name 当关联的类名不同于Rails自动推算出时,手动指定类名

:conditions 指定从数据库中取出对象的sql查询语句中加入额外的条件

:counter_sql  重载ActiveRecord自动生成的、用于统计关联中所包含的记录数量的sql。

:delete_sql 重载ActiveRecord自动生成的、用于取消关联的sql

:dependent=>:delete_all | :destroy_all | :nullify 其中delete_all使用单个sql语句删除被关联的对象,此方法不会触发被删除对象的任何destroy回调方法。destroy_all会逐个地调用被关联对象的destroy方法,将被关联的对象及父对象一起删除。nullity是默认选项,仅仅清除指向父对象的外键。

:finder_sql 指定一个完成的sql语句来读取关联,当关联非常复杂且需要依赖多个数据库表来获取数据时,可以利用这个选项

:foreign_key 重载ActiveRecord根据约定自动计算出的用于加载关联的sql语句中的外键名

:group 提供一个属性,计算结果自动根据这个属性进行分组,使用GROUP BY

:include 同belongs_to

:insert_sql 重载ActiveRecord自动生成的、用于创建关联的sql语句。

:limit 在自动生成的、用于加载关联的sql中加入一个limit

:offset 设置结果集的偏移量

:order 类似sql的ORDER BY

:select 指定查询的字段

:table_name  关联的表名

:uniq=>true 从关联的集合中剔除重复的对象

3.has_one

这个关联相对比较简单

:class_name 关联的类名

:conditions 关联的条件  v cg

:dependent 级联的操作

:foreign_key 关联的外键

:include 同上

:order 排序

 

0 0
原创粉丝点击