- 浏览: 2049449 次
- 性别:
- 来自: NYC
文章分类
- 全部博客 (628)
- Linux (53)
- RubyOnRails (294)
- HTML (8)
- 手册指南 (5)
- Mysql (14)
- PHP (3)
- Rails 汇总 (13)
- 读书 (22)
- plugin 插件介绍与应用 (12)
- Flex (2)
- Ruby技巧 (7)
- Gem包介绍 (1)
- javascript Jquery ext prototype (21)
- IT生活 (6)
- 小工具 (4)
- PHP 部署 drupal (1)
- javascript Jquery sort plugin 插件 (2)
- iphone siri ios (1)
- Ruby On Rails (106)
- 编程概念 (1)
- Unit Test (4)
- Ruby 1.9 (24)
- rake (1)
- Postgresql (6)
- ruby (5)
- respond_to? (1)
- method_missing (1)
- git (8)
- Rspec (1)
- ios (1)
- jquery (1)
- Sinatra (1)
最新评论
-
dadadada2x:
user模型里加上 protected def email ...
流行的权限管理 gem devise的定制 -
Sev7en_jun:
shrekting 写道var pattern = /^(0| ...
强悍的ip格式 正则表达式验证 -
jiasanshou:
好文章!!!
RPM包rpmbuild SPEC文件深度说明 -
寻得乐中乐:
link_to其实就是个a标签,使用css控制,添加一个参数: ...
Rails在link_to中加参数 -
aiafei0001:
完全看不懂,不知所然.能表达清楚一点?
"$ is not defined" 的问题怎么办
数据库元被影射成对象
(object-relational mapping (ORM)层)
class和table的命名对应关系实例:
Ruyb数据类型和SQL数据类型对应关系表:
访问属性(数据库列):
访问属性(数据库列)更方便的方法:
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
通常用以下代码判断:
superuser?将以下结果判断为false:
1.数字0
2.字符"0", "f", "false", 或""(空字符)
3.nil
4.常量false
自定义判断原则的方法:
数据库主键(Primary Keys)
Ruby on Rails默认以id为主键
自定义主键的方法:
class BadBook < ActiveRecord::Base
set_primary_key "isbn"
end
数据创建,读取,更新和删除(CRUD:Create, Read, Update, Delete)
创建新数据
实例:
用以下方式可以减少产生一个an_order变量:
当数据来自HTML表单时,可以考虑用以下方式:
使用create()代换new()可直接保存到数据库,省去an_order.save:
可以使用hash同时保存多组数据:
new()或create()也可以直接接参数:
order = Order.create(params)
读取数据
不安全的表单参数传递读取数据库:
更安全的方法:
你也可以这样:
终极简化版:
排序和查找第3(?)至13(?)列的方法:
联合数据表的查找方法(一般用不上):
查找有序一列的方法:
直接使用sql语句的查询方法:
在这里你也可以传递参数:
计算行数
动态查询
可同时查多个条件,如:
重载数据库
更新数据
使用save()
使用update_attribute()
使用更快捷的update()
使用update_all()
数据锁(防止数据保存撞车)
加段:lock_version int default 0,
删除数据
destroy()冻结(在model层面)
(object-relational mapping (ORM)层)
table<=>class row<=>object column<=>object attribute
class和table的命名对应关系实例:
Order<=>orders TaxAgency<=>tax_agencies Person<=>people
#复数形式关闭方法config/environment.rb: ActiveRecord::Base.pluralize_table_names = false #自定义表格名称方法: class Sheep < ActiveRecord::Base set_table_name "sheep" end
Ruyb数据类型和SQL数据类型对应关系表:
int,integer<=>Fixnum float,double,decimal,numeric<=>Float interval,date<=>Date datetime,time<=>Time char,varchar,string,clob,blob,text<=>String boolean<=>see text...
访问属性(数据库列):
account[:balance] #=> 返回当前值 account[:balance] = 0.0 #=> 指定数值
#修正数据库列的取值范围的方法: class Account < ActiveRecord::Base def balance=(value) raise BalanceTooLow if value < MINIMUM_LEVEL self[:balance] = value end 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
通常用以下代码判断:
user = Users.find_by_name("Dave") if user.superuser? grant_privileges end
superuser?将以下结果判断为false:
1.数字0
2.字符"0", "f", "false", 或""(空字符)
3.nil
4.常量false
自定义判断原则的方法:
class User < ActiveRecord::Base def superuser? self.superuser == 'J' end # . . . end
数据库主键(Primary Keys)
Ruby on Rails默认以id为主键
自定义主键的方法:
class BadBook < ActiveRecord::Base
set_primary_key "isbn"
end
数据创建,读取,更新和删除(CRUD:Create, Read, Update, Delete)
创建新数据
实例:
an_order = Order.new an_order.name ="Dave Thomas" an_order.email = "dave@pragprog.com" an_order.address = "123 Main St" an_order.pay_type = "check" an_order.save #在save()之前所有数据只存在内存中
用以下方式可以减少产生一个an_order变量:
Order.new do |o| o.name = "Dave Thomas" # . . . o.save end
当数据来自HTML表单时,可以考虑用以下方式:
an_order = Order.new( :name =>"Dave Thomas", :email =>"dave@pragprog.com", :address => "123 Main St", :pay_type =>"check") an_order.save
使用create()代换new()可直接保存到数据库,省去an_order.save:
an_order = Order.create( :name => "Dave Thomas", :email =>"dave@pragprog.com", :address =>"123 Main St", :pay_type => "check")
可以使用hash同时保存多组数据:
orders = Order.create( [ { :name =>"Dave Thomas", :email => "dave@pragprog.com", :address =>"123 Main St", :pay_type =>"check" }, { :name =>"Andy Hunt", :email =>"andy@pragprog.com", :address =>"456 Gentle Drive", :pay_type => "po" } ] )
new()或create()也可以直接接参数:
order = Order.create(params)
读取数据
an_order = Order.find(27) # 直接找出id = 27的数据 # 从一个表单读取product id列表,然后计算这些商品的总价: product_list = params[:product_ids] total = 0.0 Product.find(product_list).each {|prd| total += prd.total}
带条件的读取: pos = Order.find(:all, :conditions => "name = 'dave' and pay_type = 'po'")
不安全的表单参数传递读取数据库:
name = params[:name] # 此方法有被SQL注入方式入侵的风险!!! pos = Order.find(:all, :conditions =>"name = '#{name}' and pay_type = 'po'") #注意上面单双引号的使用及变量的传递方法
更安全的方法:
name = params[:name] pos = Order.find(:all, :conditions => ["name = ? and pay_type = 'po'", name])
你也可以这样:
name = params[:name] pay_type = params[:pay_type] pos = Order.find(:all, :conditions => ["name = :name and pay_type = :pay_type", {:pay_type => pay_type, :name => name}])
终极简化版:
pos = Order.find(:all, :conditions => ["name = :name and pay_type = :pay_type", params])
排序和查找第3(?)至13(?)列的方法:
orders = Order.find(:all, :conditions =>"name = 'Dave'", :order =>"pay_type, shipped_at DESC", :limit => 10 :offset => 2)
联合数据表的查找方法(一般用不上):
LineItem.find(:all, :conditions => "pr.title = 'Programming Ruby'", :joins =>"as li inner join products as pr on li.product_id = pr.id")
查找有序一列的方法:
order = Order.find( :first, :conditions =>"name = 'Dave Thomas'", :order => "id DESC")
直接使用sql语句的查询方法:
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 ") li = items[0] puts "#{li.title}: #{li.quantity}x#{li.unit_price} => #{li.total_price}" #你可以使用"as".
在这里你也可以传递参数:
Order.find_by_sql(["select * from orders where amount > ?", params[:amount]])
计算行数
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在#{c2}个定单里一共定了#{c3} 件商品 (目前定单总数:#{c1})"
动态查询
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)
重载数据库
stock = Market.find_by_ticker("RUBY") loop do puts "Price = #{stock.price}" sleep 60 stock.reload end
更新数据
使用save()
order = Order.find(123) order.name = "Fred" order.save orders = Order.find_by_sql("select id, name, pay_type from orders where id=123") first = orders[0] first.name ="Wilma" first.save
使用update_attribute()
order = Order.find(123) order.update_attribute(:name,"Barney") order = Order.find(321) order.update_attributes(:name => "Barney", :email =>"barney@bedrock.com")
使用更快捷的update()
order = Order.update(12, :name => "Barney", :email => "barney@bedrock.com")
使用update_all()
result = Product.update_all("price = 1.1*price", "title like '%ruby%'")
save()和save!() save() if order.save # 成功 else # 保存失败则... end
save!() begin order.save! rescue RecordInvalid => error # 保存失败RecordInvalid exception end
数据锁(防止数据保存撞车)
加段:lock_version int default 0,
删除数据
delete()删除 Order.delete(123) User.delete([2,3,4,5]) Product.delete_all(["price > ?", @expensive_price])
destroy()冻结(在model层面)
order = Order.find_by_name("Dave") order.destroy # ... order将被冻结
发表评论
-
Destroying a Postgres DB on Heroku
2013-04-24 10:58 890heroku pg:reset DATABASE -
VIM ctags setup ack
2012-04-17 22:13 3215reference ctags --extra=+f --e ... -
alias_method_chain方法在3.1以后的替代使用方式
2012-02-04 02:14 3240alias_method_chain() 是rails里的一个 ... -
一些快速解决的问题
2012-01-19 12:35 1435问题如下: 引用Could not open library ... -
API service 安全问题
2011-12-04 08:47 1342这是一个长期关注的课题 rest api Service的 ... -
Module方法调用好不好
2011-11-20 01:58 1300以前说,用module给class加singleton方法,和 ... -
一个ajax和rails交互的例子
2011-11-19 01:53 1859首先,这里用了一个,query信息解析的包,如下 https: ... -
Rails 返回hash给javascript
2011-11-19 01:43 2238这是一个特别的,不太正统的需求, 因为,大部分时候,ajax的 ... -
关于Rubymine
2011-11-18 23:21 2229开个帖子收集有关使用上的问题 前一段时间,看到半价就买了。想 ... -
ruby中和javascript中,动态方法的创建
2011-11-18 21:01 1192class Klass def hello(*args) ... -
textmate快捷键 汇总
2011-11-16 07:20 8091TextMate 列编辑模式 按住 Alt 键,用鼠标选择要 ... -
Ruby面试系列六,面试继续面试
2011-11-15 05:55 1980刚才受到打击了,充分报漏了自己基础不扎实,不肯向虎炮等兄弟学习 ... -
说说sharding
2011-11-13 00:53 1435这个东西一面试就有人 ... -
rails面试碎碎念
2011-11-12 23:51 1899面试继续面试 又有问ru ... -
最通常的git push reject 和non-fast forward是因为
2011-11-12 23:29 17149git push To git@github.com:use ... -
Rails 自身的many to many关系 self has_many
2011-11-12 01:43 2679简单点的 #注意外键在person上people: id ... -
Rails 3下的 in place editor edit in place
2011-11-12 01:20 913第一个版本 http://code.google.com/p ... -
Heroku 的诡异问题集合
2011-11-11 07:22 1657开个Post记录,在用heroku过程中的一些诡异问题和要注意 ... -
SCSS 和 SASS 和 HAML 和CoffeeScript
2011-11-07 07:52 12901Asset Pipeline 提供了内建 ... -
Invalid gemspec because of the date format in specification
2011-11-07 02:14 2072又是这个date format的错误。 上次出错忘了,记录下 ...
相关推荐
Rails中的Migration相对来说更适合做数据库的对象集合操作,而自动化的rake则是一个较好的选择,下面来浅谈Ruby on Rails下的rake与数据库数据迁移操作,需要的朋友可以参考下
rails操作 一些基本的操作,配置 连接数据库等方法
布里洛Brillo是Rails数据库清理器和加载器,用于为开发机器制作生产数据库的轻量级副本,并且混淆了敏感信息。 大多数配置是通过YAML完成的:指定要备份的模型,想要与它们的关联以及应该混淆哪些字段(以及如何混淆...
教程内容涵盖了Ruby语言基础、Rails框架搭建、Web应用开发、数据库操作、部署与维护等方面的知识。 适用人群: 本资源适用于对Web开发和Ruby on Rails框架感兴趣的初学者和有一定编程基础的开发者。 能学到什么: ...
1、获取数据 获取第一条、最后一条记录 代码如下: Model.first Model.first(options) Model.find(:first, options) Model.last ...对一组数据进行相同操作 代码如下: User.all.each do |user|
ruby中操作oracle数据库使用的oci8技术相关的gems包,包括3个版本
重定向ActiveRecord(Rails)读取到副本数据库,同时确保所有写入都转到主数据库。 状态 这是Rocket Job原始库的略微修改,只是将其从active_record_slave重命名为active_record_replica 。 为了更清楚地将库与...
FMDB 是基于sqlite的数据库操作类,稳定,但用起来还是不够简洁,PYFMDB是基于FMDB的更高层次的数据库操作类。程序介绍 PYFMDB分为三部分,PYFMDB 基于FMDB负责数据库底层操作处理,PYTable是自定义Table的基类,...
可以将其视为存储在数据库中的全局哈希,它使用类似于ActiveRecord的简单方法进行操作。 跟踪您不想硬编码到Rails应用程序中的所有全局设置。 您可以存储任何类型的对象。 字符串,数字,数组或任何对象。 安装 ...
找不到指定的模块。... 您可能感兴趣的文章:Ruby rails 页面跳转(render和redirect_to)Rails link_to 详解rails常用数据库查询操作、方法浅析学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake,
可以将其视为存储在数据库中的全局哈希,它使用类似ActiveRecord的简单方法进行操作。 跟踪您不想硬编码到Rails应用程序中的所有全局设置。 您可以存储任何类型的对象。 字符串,数字,数组,布尔值或任何对象。 ...
安装建议您在基于Debian的系统上安装Danbooru,因为APT上提供了... 使用rails控制台测试Rails数据库连接。 运行Post.count以确保Rails可以连接到数据库。 如果失败,则需要确保您的Danbooru配置文件正确。 测试Nginx以
railsblog 这是一个通过rails guide上的浅显教程做的基于rails的一个blog,支持发文,删文,评论,删评论,修改文章,并且需要登录,...不解为什么rails还在坚持删除请求用delete而不是用post再在数据库进行逻辑操作。
17.7 在迁移任务之外操作数据库结构 231 17.8 管理迁移任务 231 第18章 ActiveRecord第一部分:基础 233 18.1 表和类 233 18.2 字段和属性 234 18.3 主键与ID 237 18.4 连接数据库 238 18.5 CRUD 242 18.6 聚合与...
rails_ops 该Gem引入了Rails的附加服务层: Operations ... Rails Ops的模型操作需要ActiveRecord,但与数据库/适配器无关安装将以下内容添加到Rails应用程序的Gemfile : gem 'rails_ops' 创建具有以下内容的初始化程
您可能已经注意到,Rails约定中存在一种趋势,即用于呈现表单的逻辑与管理数据库记录变更的操作是分开的。 例如: 控制器中的new动作只是呈现new表单 create操作实际上是处理将表单数据插入数据库的过程 以类似的...
尽管它能够访问 Rails 项目中所有定义环境的数据库,但它仅用于开发。安装要在您的项目中使用 pancakes,只需将以下行添加到您的 Gemfile gem 'pancakes' 然后打开您的终端应用程序,转到 Rails 项目的根目录并运行...
您为操作数据库编写一次性脚本。 然后您将在您的环境中对其进行测试。 如果没问题,现在你将它执行到生产环境。 顺便说一句,脚本应该提交到哪里? 当然剧本已经完成了角色(安息吧..) 但。 任何机会。 客户要求...