| 作为java中的O/R Mapping的使用者来说,看到rails中的activeRecord的实现后不禁汗颜,原来O/R Mapping可以如此简单。我反复看过几遍activeRecord的文档,觉得其灵活之处不亚于hibernate,而且简单实用。现作笔录如下:1.关联n:1: belongs_to: XXXX1:n: has_many:XXX1:1: has_one :XXXm:n: has_and_belongs_to_many:XXX连接join: :through => :XXX (for ex:has_many :photos :through => :slides) rails 1.1才有此功能特殊关联:acts_as_list :列表acts_as_tree :父子关系acts_as_nested_set
class Slide < ActiveRecord::Base belongs_to :slideshow acts_as_list :scope => "slideshow_id" belongs_to :photoend表示sildes表中的slideshow_id为belongs_to :slideshow关系中的外键(FK)class Category < ActiveRecord::Base acts_as_treeend
2.级联has_many :XXX, dependent => true
3.设定主键:rails不支持复合主键,rails默认数据表中的主键名称为id,如果您的主键不为id,如下设置:class Photo < ActiveRecord::Base set_primary_key "created_at"end4.domain中的继承关系class Photographer < Personend
class Person < ActiveRecord::Baseend5.domain中的组件关系CREATE TABLE people ( id INT AUTO_INCREMENT NOT NULL, type VARCHAR(20), name VARCHAR(20), email VARCHAR(30), street_address VARCHAR(30), city VARCHAR(30), state VARCHAR(20), zip INTEGER(5), camera VARCHAR(20), PRIMARY KEY (id));
class Person < ActiveRecord::Base composed_of :address, :class_name => "Address", :mapping => [[:street_address, :street_address], [:city, :city], [:state, :State], [:zip, :zip]]endclass Address def initialize(street_address, city, state, zip) @street_address = street_address @city = city @state = state @zip = zip end
attr_reader :street_address, :city, :state, :zipend6.查找记录find_by_<column_name> find_by_idfind_by_<column_name>_and_<column_name> find_by_name_and_email(name, email)7.验证字段有效性class Photo < ActiveRecord::Base validates_presence_of :filename 验证是否为空end
validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/ivalidates_length_of :name, :within => 6..100 8.事务处理def transfer(from, to, amount) Account.transaction do from.debit(amount) to.credit(amount) endend |