修改model的属性(如果是性质变化)以后最好重启动,避免奇怪的错误
注意
1 decimal到ruby的float中运算以后精度可能_无法保证_(使用放大以后的integer代替) 2 数据表示boolean的特殊之处: Boolean处理 modelobj.name1? 来访问rails的boolean, (否则是ruby内置的低能boolean) 对比
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支持的参数
:conditinos conditions支持的参赛
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!返回nil 或者报exception ,如果表中有lock_version int default 0 字段,会自动使用乐观锁定
delete 和delete_all 会直接删除,
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了,不能回退了