使用Active Record
gem install activerecord -d --no-ri --no-rdoc
建立mysql数据库的链接:
ActiveRecord::Base.establish_connection(
:adapter => "mysql",
:host => "host",
:database => "database",
:username => "user",
:password => "pass"
)
好了,执行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: