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了,不能回退了

posted @ 2006-01-24 10:19  tech.cap  阅读(337)  评论(0编辑  收藏  举报