`

rails 数据库操作

 
阅读更多
数据库元被影射成对象 
(object-relational mapping (ORM)层) 
Ruby代码  收藏代码
  1. table<=>class  
  2. row<=>object  
  3. column<=>object attribute  


class和table的命名对应关系实例: 
Ruby代码  收藏代码
  1. Order<=>orders  
  2. TaxAgency<=>tax_agencies  
  3. Person<=>people  

Ruby代码  收藏代码
  1. #复数形式关闭方法config/environment.rb:  
  2. ActiveRecord::Base.pluralize_table_names = false  
  3. #自定义表格名称方法:  
  4. class Sheep < ActiveRecord::Base  
  5. set_table_name "sheep"  
  6. end  


Ruyb数据类型和SQL数据类型对应关系表: 
Ruby代码  收藏代码
  1. int,integer<=>Fixnum  
  2. float,double,decimal,numeric<=>Float  
  3. interval,date<=>Date  
  4. datetime,time<=>Time  
  5. char,varchar,string,clob,blob,text<=>String  
  6. boolean<=>see text...  


访问属性(数据库列): 
Ruby代码  收藏代码
  1. account[:balance#=> 返回当前值  
  2. account[:balance] = 0.0 #=> 指定数值  


Ruby代码  收藏代码
  1. #修正数据库列的取值范围的方法:  
  2. class Account < ActiveRecord::Base  
  3. def balance=(value)  
  4.    raise BalanceTooLow if value < MINIMUM_LEVEL  
  5.    self[:balance] = value  
  6. end  
  7. end  


访问属性(数据库列)更方便的方法: 
account.balance #=> 返回当前值 
account.balance = 0.0 #=> 指定数值 

以上方式得到的数据库数据将是ruby按自身的数据类型格式化好的,如果要得到原始数据,可用以下形式代码: 
account.balance_before_type_cast #=> "123.4", 字符串 
account.release_date_before_type_cast #=> "20050301" 

是非属性 
在ruby中只有false或nil才被判断为false 
通常用以下代码判断: 
Ruby代码  收藏代码
  1. user = Users.find_by_name("Dave")  
  2. if user.superuser?  
  3. grant_privileges  
  4. end  

superuser?将以下结果判断为false: 
1.数字0 
2.字符"0", "f", "false", 或""(空字符) 
3.nil 
4.常量false 

自定义判断原则的方法: 
Ruby代码  收藏代码
  1. class User < ActiveRecord::Base  
  2. def superuser?  
  3.    self.superuser == 'J'  
  4. end  
  5. # . . .  
  6. end  


数据库主键(Primary Keys) 
Ruby on Rails默认以id为主键 

自定义主键的方法: 
class BadBook < ActiveRecord::Base 
set_primary_key "isbn" 
end 

数据创建,读取,更新和删除(CRUD:Create, Read, Update, Delete) 

创建新数据 

实例: 
Ruby代码  收藏代码
  1. an_order = Order.new  
  2. an_order.name ="Dave Thomas"  
  3. an_order.email = "dave@pragprog.com"  
  4. an_order.address = "123 Main St"  
  5. an_order.pay_type = "check"  
  6. an_order.save #在save()之前所有数据只存在内存中  


用以下方式可以减少产生一个an_order变量: 
Ruby代码  收藏代码
  1. Order.new do |o|  
  2. o.name = "Dave Thomas"  
  3. # . . .  
  4. o.save  
  5. end  


当数据来自HTML表单时,可以考虑用以下方式: 
Ruby代码  收藏代码
  1. an_order = Order.new(  
  2. :name =>"Dave Thomas",  
  3. :email =>"dave@pragprog.com",  
  4. :address => "123 Main St",  
  5. :pay_type =>"check")  
  6. an_order.save  


使用create()代换new()可直接保存到数据库,省去an_order.save: 
Ruby代码  收藏代码
  1. an_order = Order.create(  
  2. :name => "Dave Thomas",  
  3. :email =>"dave@pragprog.com",  
  4. :address =>"123 Main St",  
  5. :pay_type => "check")  


可以使用hash同时保存多组数据: 
Ruby代码  收藏代码
  1. orders = Order.create(  
  2.    [ { :name =>"Dave Thomas",  
  3.      :email => "dave@pragprog.com",  
  4.      :address =>"123 Main St",  
  5.      :pay_type =>"check"  
  6.     },  
  7.     { :name =>"Andy Hunt",  
  8.      :email =>"andy@pragprog.com",  
  9.      :address =>"456 Gentle Drive",  
  10.      :pay_type => "po"  
  11.     } ] )  


new()或create()也可以直接接参数: 
order = Order.create(params) 

读取数据 
Ruby代码  收藏代码
  1. an_order = Order.find(27) # 直接找出id = 27的数据  
  2. # 从一个表单读取product id列表,然后计算这些商品的总价:  
  3. product_list = params[:product_ids]  
  4. total = 0.0  
  5. Product.find(product_list).each {|prd| total += prd.total}  


Ruby代码  收藏代码
  1. 带条件的读取:  
  2. pos = Order.find(:all,  
  3. :conditions => "name = 'dave' and pay_type = 'po'")  


不安全的表单参数传递读取数据库: 
Ruby代码  收藏代码
  1. name = params[:name]  
  2. # 此方法有被SQL注入方式入侵的风险!!!  
  3. pos = Order.find(:all,  
  4. :conditions =>"name = '#{name}' and pay_type = 'po'")  
  5. #注意上面单双引号的使用及变量的传递方法  

更安全的方法: 
Ruby代码  收藏代码
  1. name = params[:name]  
  2. pos = Order.find(:all,  
  3. :conditions => ["name = ? and pay_type = 'po'", name])  


你也可以这样: 
Ruby代码  收藏代码
  1. name = params[:name]  
  2. pay_type = params[:pay_type]  
  3. pos = Order.find(:all,  
  4. :conditions => ["name = :name and pay_type = :pay_type",  
  5. {:pay_type => pay_type, :name => name}])  


终极简化版: 
Ruby代码  收藏代码
  1. pos = Order.find(:all,  
  2. :conditions => ["name = :name and pay_type = :pay_type", params])  


排序和查找第3(?)至13(?)列的方法: 
Ruby代码  收藏代码
  1. orders = Order.find(:all,  
  2. :conditions =>"name = 'Dave'",  
  3. :order =>"pay_type, shipped_at DESC",  
  4. :limit => 10  
  5. :offset => 2)  


联合数据表的查找方法(一般用不上): 
Ruby代码  收藏代码
  1. LineItem.find(:all,  
  2. :conditions => "pr.title = 'Programming Ruby'",  
  3. :joins =>"as li inner join products as pr on li.product_id = pr.id")  

查找有序一列的方法: 
Ruby代码  收藏代码
  1. order = Order.find( :first,  
  2. :conditions =>"name = 'Dave Thomas'",  
  3. :order => "id DESC")  


直接使用sql语句的查询方法: 
Ruby代码  收藏代码
  1. items = LineItem.find_by_sql("select *, quantity*unit_price as total_price,products.title as title from line_items, products where line_items.product_id = products.id ")  
  2. li = items[0]  
  3. puts "#{li.title}: #{li.quantity}x#{li.unit_price} => #{li.total_price}"  
  4. #你可以使用"as".  


在这里你也可以传递参数: 
Ruby代码  收藏代码
  1. Order.find_by_sql(["select * from orders where amount > ?",  
  2. params[:amount]])  


计算行数 
Ruby代码  收藏代码
  1. c1 = Order.count  
  2. c2 = Order.count(["name = ?""Dave Thomas"])  
  3. c3 = LineItem.count_by_sql("select count(*) from line_items, orders   where line_items.order_id = orders.id and orders.name = 'Dave Thomas' ")  
  4. puts "Dave在#{c2}个定单里一共定了#{c3} 件商品 (目前定单总数:#{c1})"  


动态查询 
Ruby代码  收藏代码
  1. order = Order.find_by_name("Dave Thomas")#只查一列  
  2. orders = Order.find_all_by_name("Dave Thomas")  
  3. order = Order.find_all_by_email(params['email'])  


可同时查多个条件,如: 
Ruby代码  收藏代码
  1. user = User.find_by_name_and_password(name, pw)  


重载数据库 
Ruby代码  收藏代码
  1. stock = Market.find_by_ticker("RUBY")  
  2. loop do  
  3. puts "Price = #{stock.price}"  
  4. sleep 60  
  5. stock.reload  
  6. end  


更新数据 
使用save() 
Ruby代码  收藏代码
  1. order = Order.find(123)  
  2. order.name = "Fred"  
  3. order.save  
  4.   
  5. orders = Order.find_by_sql("select id, name, pay_type from orders where id=123")  
  6. first = orders[0]  
  7. first.name ="Wilma"  
  8. first.save  

使用update_attribute() 
Ruby代码  收藏代码
  1. order = Order.find(123)  
  2. order.update_attribute(:name,"Barney")  
  3. order = Order.find(321)  
  4. order.update_attributes(:name => "Barney",  
  5. :email =>"barney@bedrock.com")  


使用更快捷的update() 
Ruby代码  收藏代码
  1. order = Order.update(12, :name => "Barney":email => "barney@bedrock.com")  


使用update_all() 
Ruby代码  收藏代码
  1. result = Product.update_all("price = 1.1*price""title like '%ruby%'")  


Ruby代码  收藏代码
  1. save()和save!()  
  2. save()  
  3. if order.save  
  4. # 成功  
  5. else  
  6. # 保存失败则...  
  7. end  


Ruby代码  收藏代码
  1. save!()  
  2. begin  
  3. order.save!  
  4. rescue RecordInvalid => error  
  5. # 保存失败RecordInvalid exception  
  6. end  


数据锁(防止数据保存撞车) 
加段:lock_version int default 0, 


删除数据 
Ruby代码  收藏代码
  1. delete()删除  
  2. Order.delete(123)  
  3. User.delete([2,3,4,5])  
  4. Product.delete_all(["price > ?"@expensive_price])  


destroy()冻结(在model层面) 
Ruby代码  收藏代码
  1. order = Order.find_by_name("Dave")  
  2. order.destroy  
  3. # ... order将被冻结  
分享到:
评论

相关推荐

    Ruby on rails 数据库详细配置

    配置完成后,Rails应用程序将能够根据这些参数与数据库建立连接,并执行CRUD(创建、读取、更新、删除)操作。Rails的ActiveRecord库提供了方便的数据模型抽象,使得开发者可以使用Ruby代码轻松操作数据库表。 总的...

    使用Rails 数据库DSL与PHP协作开发 - 色色

    Rails是Ruby on Rails的简称,它是一个基于Ruby语言的开源Web应用框架,而DSL则是用于简化数据库操作的语言特性。在Rails中,数据库DSL使得开发者可以更直观、简洁地编写数据库查询。 首先,让我们深入了解Rails中...

    Rails相关电子书汇总二

    标题中的“Rails相关电子书汇总二”表明这是一个关于Ruby on Rails框架的电子书籍集合,特别是与Active Record数据库交互相关的主题...对于那些寻求深入理解Rails数据库操作的开发者来说,这本书无疑是一份宝贵的资源。

    浅谈Ruby on Rails下的rake与数据库数据迁移操作

    在Ruby on Rails框架中,数据库迁移是开发过程中不可或缺的一部分,用于管理数据库模式的变化。本文将深入探讨Rails中的rake工具和数据库迁移的概念,以及如何正确地利用它们。 首先,Rails中的Migration是数据库...

    rails操作.docx

    Rails的数据库操作主要通过ActiveRecord实现,它是一种ORM(对象关系映射)工具,使得Ruby对象可以直接操作数据库记录。 生成Web程序是Rails的一大特色。通过`rails generate`命令,可以自动生成控制器、模型、视图...

    ruby on rails 3.1.0数据库查询方法汇总

    在 Ruby on Rails 3.1.0 中,对于数据库的操作非常便捷,主要包括数据的保存、创建、查找等功能。 1. **保存数据**: - `a = Category.new(:name =&gt; 'Ruby', :position =&gt; 1)` - `a.save` - `save` 方法用于保存...

    Ruby-Multiverse让Rails支持多数据库

    默认情况下,Rails仅支持单个主数据库,但Multiverse允许开发者定义和管理多个数据库,使数据分片和扩展变得更加简单。 在Rails中使用Multiverse,首先需要安装相应的gem。在Gemfile中添加`gem 'multiverse'`,然后...

    Ruby-SecondBase为Rails提供双数据库无缝相集成

    ActiveRecord是Rails的核心组件之一,它负责数据库操作和模型之间的关系管理。通过SecondBase,开发者可以方便地在不同的数据库之间切换,执行特定的数据操作,比如创建、迁移和进行测试。 创建数据库时,...

    GORM_ADO数据库操作模块.rar

    GORM,全称Grails Object Relational Mapping,是Grails框架中的数据持久化工具,它提供了简洁的API,使得开发者可以方便地进行数据库操作,类似于Java的Hibernate或Ruby on Rails的ActiveRecord。GORM不仅支持关系...

    rails向导打包

    本压缩包包含了多个关键主题的详细文档,涵盖了从数据库操作到应用调试等多个方面。让我们逐一探索这些文件所涵盖的知识点。 1. **Active Record 查询接口**: Active Record 是 Rails 的核心组件之一,它负责模型和...

    语言后端:Lin-guage应用程序的Ruby on Rails数据库

    在"语言后端:Lin-guage应用程序的Ruby on Rails数据库"这一主题中,我们将深入探讨如何使用Rails构建一个语言学习应用的后端系统,特别是涉及到数据库的设计和管理。 首先,Rails遵循MVC(Model-View-Controller)...

    《web开发敏捷之道 应用rails进行敏捷web开发》(第一版)的depot源代码

    3. **ActiveRecord**:Rails中的ActiveRecord是ORM(对象关系映射)库,它允许开发者用Ruby类和对象直接操作数据库,简化了数据库交互。 4. **路由**:Rails的路由系统是连接URL与控制器动作的桥梁,定义了URL模式...

    ruby on rails对mongodb的操作

    在Ruby on Rails框架中,开发人员经常选择使用关系型数据库如SQLite、PostgreSQL或MySQL来存储数据。然而,随着NoSQL数据库的兴起,MongoDB因其灵活性和非结构化数据处理能力,也成为了许多Web应用程序的选择。本文...

    Rails 101 入门电子书

    ### Rails 101 入门电子书知识点详解 #### 一、简介 ...通过以上内容的学习,初学者可以全面掌握Ruby on Rails的基础知识,包括环境搭建、基本操作、高级特性等,为后续更深入的学习打下坚实的基础。

    rails指南 中文版

    1. **ActiveRecord**:这是Rails框架中的ORM(Object-Relational Mapping)组件,它负责处理数据库操作。通过ActiveRecord,开发者可以使用面向对象的方式来操作数据,而无需编写SQL语句。 2. **ActionController**...

    brillo:Rails数据库清理器和加载器,用于开发中的生产数据库的轻量级快照

    布里洛Brillo是Rails数据库清理器和加载器,用于为开发机器制作生产数据库的轻量级副本,并且混淆了敏感信息。 大多数配置是通过YAML完成的:指定要备份的模型,想要与它们的关联以及应该混淆哪些字段(以及如何混淆...

    Rails101_by_rails4.0

    Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它遵循模型-视图-控制器(MVC)的架构模式,设计用来快速开发数据库驱动的动态网页。随着Rails版本的更新迭代,此书聚焦于一个特定的版本,帮助...

    Rails项目源代码

    Rails使用ActiveRecord作为ORM,它使得Ruby类可以直接与数据库表进行交互。在这个项目中,`User`和`Image`模型可能会与数据库中的相应表关联,通过定义属性和关系,如`has_many :images`表示一个用户可以拥有多个...

    Rails3常用命令行命令

    在数据库操作方面,你可以使用以下命令连接到数据库控制台: ```bash sudo rails dbconsole ``` 如果你在Ubuntu上,可能需要使用`sudo`以获得必要的权限。此外,Rails的迁移(Migrations)系统允许你对数据库结构...

Global site tag (gtag.js) - Google Analytics