使用Active Record

上一篇 / 下一篇  2013-08-28 11:56:54

gem install activerecord -d --no-ri --no-rdoc

建立mysql数据库的链接:

ActiveRecord::Base.establish_connection(
:adapter => "mysql",
:host => "host",
:database => "database",
:username => "user",
:password => "pass"
)

Active Record支持DB2,MySql,Oracle,Postgres,SqlServer,以及SqlLite,每一种数据库适配器在链接的参数上都有一些细小的差别,下表列出了常用的参数:

好了,执行mysql数据库连接,发现执行报错:
incorrect MySQL client library version! This gem was compiled for 6.0.0 but the client library is 5.5.20. 的解决办法:

从mysql官方http://dev.mysql.com/downloads/mysql下载 mysql-connector-c-noinstall-6.0.2-win32 解压到e:/。注意根据自己的实际情况下载相对应的版本,这里使用非安装版。

gem install mysql --platform=ruby -- --with-mysql-dir=e:/mysql-connector-c-noinstall-6.0.2-win32

然后将 E:\mysql-connector-c-noinstall-6.0.2-win32\lib 目录下的 libmysql.lib 文件复制到 RUBY_HOME\bin 目录下。

重新执行刚才的命令即可。

Class User < ActiveRecord::Base

end
此时ActiveRecord会根据约定(类名后加s)去"database"数据库中查找Users的表,也可自定义查找的表名称set_table_name "Users",但貌似最新版本的ActiveRecord不支持set_table_name方法了,改用self.table_name = "Users" 即可。
Class User < ActiveRecord::Base
self.table_name= "User"
end

然后就可以使用User来查找db数据了:
user = User.find_by_passport_id '11656754'

使用alias_attribute可以为字段建立别名:
class User < ActiveRecord::Base
self.table_name= "User"
alias_attribute :uid, 'id'
alias_attribute :pid, 'passport_id'
end

user = User.find_by_pid '11656754'与 
user = User.find_by_passport_id '11656754'效果相同

读取或设置属性值,可以使用一个字符串或者标记,在这里我们使用标记,例如:
user[:email_adress]
user[:email_adress] = "test@qq.com"

或者使用ruby的访问方法:
user.email_adress
user.email_adress = "test@qq.com"

保存记录
user.save

Active Record的构造器有一个可选的块(block),这个块可以将创建的User对象做为参数,这样就不需要再创建一个User类的对象的变量了:
User.new do |user|
user.name = "Dave Thomas"
 # . . . 
user.save
end

Active Record也可以接收一组哈希(Hash)参数的值来作为可选参数,由属性的名字和相对应的值组成: 
user = User.new( :chinese_name => "Dave",  :email_address => "dave@qq.com")
user .save

Active Record还有一个约定的方法create(),下面的例子说明这个方法的用法,同时展示了创建对象和存储到数据库: user = User.create( :chinese_name => "Dave",  :email => "dave@qq.com")    

也可以给create()方法传递哈希(hash)的数组,在数据库中创建多条记录,并且返回对应的对象数组:
users = User.create([{ :name => "Dave Thomas", :email => "dave@qq.com"},  { :name => "Andy",  :email => "andy@qq.com"}])   

方法new()和create()的真正目的就是让我们可以通过一组参数就能够创建Model对象:  
user = User.create(params)

设置主键:set_primary_key "colnum name"

find():通过主键查找记录
:first,:all

User.find(:first,:conditions=>"passport_id='11656754'")
ps.这里查询条件用别名pid貌似无效

简单版本:
User.where(passport_id:"11656754",gender:"M")
Student.where(grade:9..12) #between
Student.where(grade:[9,10,11,12] #in

使用占位符?:
User.find(:all,:conditions=>["passport_id=?","11656754"])

或者使用带命字的占位符:
User.find(:all,:conditions=>["passport_id=:pid and id=:uid",{:pid=>"11656754",:uid=>457799}])

可以把后面的占位参数拿出来:
params={:pid=>"11656754",:uid=>457799}
User.find(:all,:conditions=>["passport_id=:pid and id=:uid",params])


:order、:limit、:offset

user=User.find(:all,:conditions=>"gender=M",:order=>"id desc",:limit=>50,:offset=>10)

:join

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

User.find(:all,:conditions=>"Gender='F'",:joins=>"as u inner join student as s on s.passport_id=u.passport_id")

这里为表建立别名后貌似有问题,会报错:
Unknown table 'User': SELECT `User`.* From `User` as u ……
给user表建立了别名u,再去用`User`.*就找不到表了

find方法为我们构建了完整的Sql查询,而方法find_by_sql方法则允许我们对Sql有完整的控制,该方法只有一个参数,就是你想要使用的完整的sql语句,下面是示例代码: rders = LineItem.find_by_sql("select line_items.* from line_items, orders " + " where order_id = orders.id " + " and orders.name = 'Dave Thomas' ")

在find_by_sql方法中,我们一样可以使用占位符来给Sql语句传递参数,例如: Order.find_by_sql(["select * from orders where amount > ?",params[:amount]])

可以使用字段名字对应的find方法来查询,例如:
order = Order.find_by_name("Dave Thomas")
orders = Order.find_all_by_name("Dave Thomas")
order = Order.find_all_by_email(params['email'])

order = Order.find_by_name("Dave Thomas", other args...)    
上面的调用等效的转换为:  
order = Order.find(:first,:conditions => ["name = ?", "Dave Thomas"], other_args...)

类似的,调用一个find_all_by_xxx方法相当于调用find(:all, )方法。

Active Record还可以对多个列创建查询器(finder),例如,你可以写:   
user = User.find_by_name_and_password(name, passw)
相当于:
user = User.find(:first,:conditions => ["name = ? and password = ?", name, passw]) 

Active Record提供了两个方法来获取符合条件的记录的条数:count()和count_by_sql()。例如: 
c1 = Order.count  
c2 = Order.count(:all,:conditions=>["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' ")

调用reload()方法,Model对象属性的值就会被数据库中的值更新
user.reload()

如果你有一个Active Record对象(或许对应于order表),你可以通过调用save方法将它写道数据库中去,如果这个对象是先前从数据库中读取出来的,save方法将会更新既有的记录,否则将会新建一条记录。   
如果一条既有记录被更新,Active Record将会用它的主键和来匹配内存中的对象,Active Record对象中的属性被更新到对应的列,即使一个列中的值没有变化也会被更新,在下面的例子中,id为123的订单所有的内容都会被更新:
order = Order.find(123)
order.save

在下面的例子里,Active Record对象只包含id,name,paytype,当对象被保存的时候仅仅只有这些字段被更新,注意如果你想要把对象保存到数据库,那么在使用find_by_sql方法时,一定要包含id字段。
orders = Order.find_by_sql("select id, name, pay_type from orders where id=123") 
first_order = orders[0] 
first_order.name = "Wilma"
first_order.save

update_attribute&update_attributes
该方法可以将Model对象的某个属性/某组属性保存到数据库,(不用save)

order = Order.find(123)
order.update_attribute(:name,"jim")
order = Order.find(321)
order.update_attributes(:name=>"Tom",:address=>"abc")

可以把读取和更新结合在一起,使用update()方法或update_all()
update()方法使用一个id和一组属性,如果在数据库中对应的记录,就更新指定的属性,然后返回model对象。   
order = Order.update(12, :name => "Barney", :email => "barney@bedrock.com")

也可以传递一组id或者属性和值的hash给update()方法,这样会更新所有匹配的记录,并且返回一组model对象。
最后,update_all()方法允许你指定给update语句指定Where条件,下面的例子给所有标题中含有java的商品涨价10%:
result = Product.update_all("price = 1.1*price", "title like '%Java%'")

save&save!

save()方法在Model对象存在并且可以的保存的情况下返回true,不会抛出异常;使用save!()方法,如果Model对象不能保存,那么这个方法会抛出一个RecordInvailid异常

TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-04-29  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 31849
  • 日志数: 22
  • 建立时间: 2013-08-19
  • 更新时间: 2014-04-01

RSS订阅

Open Toolbar