rails笔记 activerecord 1
rails笔记 activerecord
修改model的属性(如果是性质变化)以后最好重启动,避免奇怪的错误
自动类型转换:
- int, integer => Fixnum
- decimal, numeric => Float
- clob, blob, text => String
- interval, date => Date
- float, double => FLoat
- char, varchar, string => String
- datetime, time => Time
- boolean => 字面值
注意
1 decimal到ruby的float中运算以后精度可能_无法保证_(使用放大以后的integer代替) 2 数据表示boolean的特殊之处: Boolean处理 modelobj.name1? 来访问rails的boolean, (否则是ruby内置的低能boolean) 对比
- rails: 0 ,"0","f","false","" ,nil, false 都是false,其他为true
- ruby: nil,false是false, 其他为true_ 若要定制boolean可以自己写一个name1?的方法
record的mapping
ModelClass.columns.map{|col|col.name} 查看column ModelClass.columns_hash 返回列信息hash
访问数据
使用object.property访问, 也可以使用object[:property]的方式访问(当和ruby保留字冲突时) 后者还可以用来覆盖默认行为,比如
class Account < ActiveRecord::Base
def balance=(value)
raise BalanceTooLow if value < MINIMUM_LEVEL
self[:balance] = value
end
end
添加modelobj1.name1_before_type_cast可以得到原始的数据对象(未转换的)
serialize :last_five 可以使用YAML序列化任何对象到TEXT字段,但是这样只有识别YAML的程序可以读取
set_primary_key 'another_column' 可以让rails按照another_column来当id, 但是在对象级别访问还是使用id属性(此时映射到another_column)
使用establish_connection方法可以连接到不同于配置的数据库,方法中忽略的参数还是从配置读取默认值
对象操作
创建
new是内存中, save以后才到数据苦 Order.new do |o| ... o.save end
create一步搞定,可以接受一个hash和hash的数组来创建多个, 返回创建的数组,比如order=Order.create(params)(直接从http上拿参数创建)
find 查找
find支持的参数
- :all or :first
-
:conditinos conditions支持的参赛
- 直接使用sql conditions=>"..."
- 使用?参数conditons=>["..?..",a]
- 使用conditons=>["..:name", hash]
- :order
- :limit
- :offset
- :include
join指令, 可能用得不多 ???
LineItem.find(:all, :conditions => "pr.title = 'Programming Ruby'", :joins => "as li inner join products as pr on li.product_id = pr.id")
Order.count(支持的参数和:condition类似) 可以获取记录数
默认按照id来find会找不到报异常, 但是自己的复杂find只会返回空记录(nil or []) ObjectA.find_by_sql 可以生成自由填充的ObjectA, 但是如果要修改记得要load id
find_(all)_by_A_and_B(a,b) (只支 持and) 可以自动转换为find(:first(:all) ,:conditions=>'A=? and B=?',a,b)
reload重新读取
- save 返回true false
-
save!返回nil 或者报exception ,如果表中有lock_version int default 0 字段,会自动使用乐观锁定
-
delete 和delete_all 会直接删除,
- destory和destory_all会把对象都读入内存然后调用所有的callback然后再删除(没有前面快)
事务
rails里面实现trasaction, 通过trasaction(obj1,objec2) 调用会自动rollback内存里面的对象
rails内置的 save,delete方法(可能导致多个sql)默认是事务(原子)的,不用额外加事务
rails不支持跨数据库事务(至少目前),下面有个简单模拟方案
User.transaction(user) do
Account.transaction(account) do
account.calculate_fees
user.date_fees_last_calculated = Time.now
user.save
account.save
end
end
但是这样只是模拟,如果是执行期出错可以回退, 但是user commit的时候如果出错, 此时内部的account已经commit了,不能回退了