`

Ruby on rails ActiveRecord

阅读更多
ActiveRecord介绍
1.当你创建一个ActiveRecord::Base的子类,实际上是包装一个数据库表。
2.active record假定表名是类的复数形式。如果类名包含多个以大写字母开头的单词,表名会假定以下划线分隔这些单词。
3.如果你不喜欢上面的做法,你可以这样:在配置文件中设置一个全局变量关闭它,在config目录下environment.rb文件中设置。
ActiveRecord::Base.pluralize_table_names=false

4.连接数据库
active record把数据库连接的概念抽象出来,有助于程序处理各种特殊数据库的底层细节.active record程序使用通用的调用,代理了一组数据库适配器的细节.
指定连接的一种方式是使用establish_connection()类方法。
举例来说,
ActiveRecord::Base.establish_connection(  :adapter => "mysql",  :host => "dbserver.com",  :database => "railsdb",  :username => "railsuser",  :password => "railspw" )

第二种方式是:我们还可以在config/database.yml的配置文件中设置连接参数。
这样做的好处不仅在于连接信息和代码分离,而且有利于测试和部署。
5.创建新记录
我们可以通过调用Order.new()来创建一个对象,表示orders表中的行。然后填充各属性的值,对应表的各列。最后调用对象的save()方法存储到数据库。
active record的constructor可以有一个可选的块参数。如果用上的话,这个块会作为一个参数调用来创建一个Order。这种用法有一个好处,可以不用创建一个临时变量。
Order.new do |o|  
o.name = "Dave Thomas"  
# . . .  
o.save 
end

6.读取已经存在的行
an_order = Order.find(27) 
order_list = params[: order_ids] 
orders = Order.find(order_list) 
count = orders.size

find()中的有变量是指返回匹配条件的第一行,而:all返回匹配行的数组。
pos = Order.find(:all, :conditions => "name = 'dave' and pay_type = 'po'")

这句的意思是:返回符合name为dave,pay_type为po的所有记录。
pos = Order.find(:all,:conditions => "name = '#{name}' and pay_type = 'po'")

这句可以直接在条件中使用变量,但是这样容易引起sql注入攻击。
为了防止sql注入攻击,我们可以使用动态的sql,如下:
pos = Order.find(:all,:conditions => ["name = ? and pay_type = 'po'", name])
name = params[:name] 

或者如下:
pay_type = params[:pay_type] 
name = params[:name]
pos = Order.find(:all,:conditions => ["name = :name and pay_type = :pay_type",                                {:pay_type => pay_type, :name => name}])

还有排序和 limit
find(:all,       : order => "id",       :limit => page_size,       : offset => page_num*page_size)

join的使用
find(:all,  :conditions => "pr.title = 'Programming Ruby'",  :joins => "as li inner join products as pr on li.product_id = pr.id")

find_by_sql()带上条件,传入一个数组,第一个元素是一个包含占位符的字符串。数组余下的部分或是一个散列或是替代值的列表。
7.给记录计数
c1 = Order.count 
c2 = Order.count(["name = ?", "Dave Thomas"]) 
c3 = LineItem.count_by_sql("select count(*) " +  " from line_items, orders " +  " where line_items.order_id = orders.id " +  " and orders.name = 'Dave Thomas' ") puts "Dave has #{c3} line items in #{c2} orders (#{c1} orders in all)"

8.动态查找器
order = Order.find_by_name("Dave Thomas") 
orders = Order.find_all_by_name("Dave Thomas") 
order = Order.find_all_by_email(params['email'])
user = User.find_by_name_and_password(name, pw) 

这对大多数时侯是有效的,除非你有诸如tax_and_shipping的列名  
reload()基本上是在unit test中使用,其他情况很少使用
9.更新已经存在的记录
除了save()外,active record还可以让你直接用单一的方法调用update_attribute()改变属性值并保存model对象。
order.update_attributes(:name => "Barney", :email => "barney@bedrock.com")
order = Order.update(12, :name => "Barney", :email => "barney@bedrock.com")
result = Product.update_all("price = 1.1*price", "title like '%Java%'")

10.save()与save!()方法
如果model对象是有效的并且能够保存的话,save()返回true。
如果你想在需要的地方保存model对象,又想所有的错误自动得到处理的话,你就直接使用save!()吧。这个方法如果碰到对象不能保存,就抛出一个RecordInvalid的异常。
begin  
order.save! 
rescue RecordInvalid => error  
# validation failed 
end

11.删除记录
它有两个类方法delete()和delete_all(),都是在数据库级别上来操作。delete()方法使用一个id或一个id数组,来删除表中相应的记录。delete_all()删除匹配给定条件的记录行,如果没有条件就删除全部的记录。
12.表之间的关系
active record支持三种表之间的关系:
一对一,一对多,多对多。你可以通过在model中加入声明has_one,has_many,belongs_to,has_and_belongs_to_many
has_one声明一个给定的类是本身类。has_one声明和belongs_to一样定义同一个方法集,改变active record的默认行为。除了我们在belongs_to()看到的:class_name,:foreign_key,:conditions,还可以使用:dependent和: order。:dependent选项是指子表中的记录行不能独立于对应的父表记录行而单独存在。这就意味着如果你删除了父类的记录,而且你定义了:dependent=>true的话,active record将会自动删除子表中相关的记录行。 : order选项,是决定记录返回之前怎样排序。
has_many声明   has_many定义了一个属性,它就像子类集合一样。子表用belongs_to来表明它的父类。你要把子类作为一个数组存储,查询特别的子类,加入新的子类。
多对多的关系   多对多的关系是对称的关系,两个连接的表都互相使用has_and_belongs_to_many来声明它们之间的关系










分享到:
评论

相关推荐

    提升Ruby on Rails性能的几个解决方案

    Ruby On Rails 框架自它提出之日起就受到广泛关注,在“不要重复自己”,“约定优于配置”等思想的指导下,Rails 带给 Web 开发者的是极高的开发效率。 ActiveRecord 的灵活让你再也不用配置繁琐的 Hibernate 即可...

    Ruby on Rails程序设计深入剖析与范例应用

    本章详细介绍Rails数据持久化技术ActiveRecord的使用,包括ORM与ActiveRecord的简介、建立数据表的映射、执行动态查询、插入数据、删除数据、表之间的关联,以及数据有效性验证等。  第11章 MVC的控制器层。本章...

    Ruby on Rails Guides_ A Guide to Active Record Associations.pdf

    Ruby on Rails Guides_ A Guide to Active Record Associations.pdf

    Ruby on Rails中的ActiveRecord编程指南

    主要介绍了Ruby on Rails中的ActiveRecord编程指南,作者对编写ActiveRecord的通用习惯给出了建议,需要的朋友可以参考下

    Ruby on Rails Web开发之旅.pdf【第二部分】

    《Ruby.on.Rails.Web开发之旅》,作者:【德】Patrick Lenz,翻译:王德民、刘昕、裴立秋,出版社:人民邮电出版社,ISBN:9787115188526,PDF 格式,大小 144 Mb,被压缩为 3 部分,本资源是第二部分;第一部分下载...

    Ruby on Rails Web开发之旅.pdf【第一部分】

    《Ruby.on.Rails.Web开发之旅》,作者:【德】Patrick Lenz,翻译:王德民、刘昕、裴立秋,出版社:人民邮电出版社,ISBN:9787115188526,PDF 格式,大小 144 Mb,被压缩为 3 部分,本资源是第一部分;第二部分下载...

    Ruby on Rails Web开发之旅.pdf【第三部分】

    《Ruby.on.Rails.Web开发之旅》,作者:【德】Patrick Lenz,翻译:王德民、刘昕、裴立秋,出版社:人民邮电出版社,ISBN:9787115188526,PDF 格式,大小 144 Mb,被压缩为 3 部分,本资源是第三部分;第一部分下载...

    将ActiveRecord模型组织成树状结构-Ruby开发

    Ancestry Ancestry是一个宝石,它允许将Ruby on Rails ActiveRecord模型的记录组织为树结构(或层次结构)。 它使用物化路径模式使用单个数据库列。 它公开了一个祖先祖先是一颗宝石,它可以将Ruby on Rails ...

    在Ruby on Rails中优化ActiveRecord的方法

    Ruby on Rails 编程常常会将您宠坏。这一不断发展的框架会让您从其他框架的沉闷乏味中解脱出来。您可以用习以为常的几行代码片断表达自己的意图。而且还可以使用 ActiveRecord。 对于我这样的一个老 Java? 程序员而...

    web开发_ruby_on_rails

    Ruby on Rails 是无可非议的Ruby 杀手锏应用程序。它提供很多保障将Ruby 从其日文 本土的隐晦中解脱出来。没有其他任何一门编程语言可以以这样一个简单的Web应用程 序框架而自豪,该框架也吸取了大部分该语言开发者...

    awesome-rails-security:Ruby on Rails应用程序安全资源的精选列表

    Ruby on Rails应用程序安全资源的精选列表 目录 资源 官方资源 实验室-脆弱的应用程序 最佳实践 反模式 附加阅读 报告错误 宝石 身份验证和OAuth Devise-带Warden的Rails的灵活身份验证解决方案 Devise Security...

    Four Days On Rails

    Four Days On Rails. Ruby on rails入门教程(英文版)。

    actionpresenter:Ruby on Rails 的轻量级演示器实现

    Ruby on Rails 的轻量级演示器实现。 要求 Ruby on Rails >= 4 安装 将此添加到您的 Gemfile 中: gem 'actionpresenter' , '0.2.0' 在项目中创建app/presenters文件夹,该文件夹将保存演示者文件。 用法 假设...

    祖先:将ActiveRecord模型组织成树状结构

    祖先祖先是一种宝石,它允许将Ruby on Rails ActiveRecord模型的记录组织为树结构(或层次结构)。 它采用了物化路径模式,并公开了所有标准的树结构关系(祖先,父级,根级,子级,同级,后代),从而允许在单个SQL...

    curso-rails-feevale:Feevale 的 Ruby on Rails 课程

    #Feevale 的 Ruby on Rails 课程##Ruby历史安装语言(面向对象、块、模块和语法) 宝石交互式控制台 (irb) 元编程##Rails - 概述目前网络开发配置约定MVC ##Rails - 模型(ActiveRecord + ActiveModel) 迁移验证...

    heroku-puma-demo:使用 Heroku 上的 Puma Web 服务器部署的 Ruby on Rails Web 应用程序演示

    在 Heroku 上使用 Puma Web 服务器的 Ruby on Rails 使用部署在Puma Web 服务器的示例 Ruby on Rails 应用程序。 2015 年 1 月 23 日,Heroku 宣布 Puma 为推荐的 Ruby Web 服务器。 来自: Heroku 现在推荐使用 ...

    elasticsearch-rails:用于ActiveModelRecord和Ruby on Rails的Elasticsearch集成

    该存储库包含用于各种Ruby和Rails集成: ActiveModel与ActiveRecord和Mongoid适配器的集成 基于存储库模式的Ruby对象持久层 基于可枚举的搜索结果包装器 ActiveRecord ::基于关系的包装器,用于将搜索结果作为记录...

Global site tag (gtag.js) - Google Analytics