Rails 数据库表之间关系
2010-04-30 10:56
218 查看
一对一关系实例: one-to-one
Ruby代码
class Order < ActiveRecord::Base
has_one :paid_order,
:class_name =>"Order",
:foreign_key => "order_id",
:conditions => "paid_on is not null"
在表格上加order_id (表格名单数_id)
Ruby代码
class Invoice < ActiveRecord::Base
belongs_to :order
可选参数:class_name, :foreign_key, order, :conditions
Ruby代码
:dependent => true #删除主表行时同时删除子行
自定义的order用法:
class Customer < ActiveRecord::Base
has_many :orders
has_one :most_recent_order,
:class_name => 'Order',
:order => 'created_at DESC'
end
主.从 将被保存
Ruby代码
an_invoice = Invoice.new(...)
order.invoice = an_invoice # invoice被保存
从.主 将要手动保存
新增加的方法:
Ruby代码
product(force_reload=false)
product=(obj)
build_product(attributes={})
create_product(attributes={})
一对多关系(one-to-many)
Ruby代码
class Order < ActiveRecord::Base
has_many :line_items
可选参数除了上面的,还有:exclusively_dependent, :finder_sql,:counter_sql
:exclusively_dependent 在子行没有其它表格瓜葛的情况下使用, 加快处理速度.
:finder_sql的使用实例:
Ruby代码
class Order < ActiveRecord::Base
has_many :rails_line_items,
:class_name => "LineItem",
:finder_sql => "select l. * from line_items l, products p " +
" where l.product_id = p.id " +
" and p.title like '%rails%'"
end
order的用法:
Ruby代码
class Order < ActiveRecord::Base
has_many :line_items,
:order =>"quantity, unit_price DESC"
end
主.从 将被保存
Ruby代码
an_invoice = Invoice.new(...)
order.invoices <<an_invoice # invoice
class LineItem < ActiveRecord::Base
belongs_to :order
. . .
has_many后可以引用集合:
Ruby代码
order = Order.find(123)
total = 0.0
order.line_items.each do |li|
total += li.quantity * li.unit_price
end
新增加的方法:
Ruby代码
orders(force_reload=false)
orders <<order
orders.push(order1, ...)
orders.delete(order1, ...)
orders.clear
orders.find(options...)
orders.build(attributes={})
orders.create(attributes={})
多对多关系(many-to-many):
Ruby代码
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
#. . .
class Category < ActiveRecord::Base
has_and_belongs_to_many :products
#. . .
要创建一个中间表格:
categories_products
两表格名字复数形式相联, 排字母前后排序
表格内连关联键
略
预载子表
用:include将子表内容加入内存,提高查询速度, 但损耗内存:
Ruby代码
for post in Post.find(:all, :include => [:author, :comments])
puts "Post: #{post.title}"
puts "Written by: #{post.author.name}"
puts "Last comment on: #{post.comments.first.created_on}"
end
自动计算子表行数
belongs_to加参数:
Ruby代码
counter_cache => true
数据库加 子表格名(复数)_count 段, 并加 :default=>0参数.
然后用 .size可以读取子表行数.
刷新数据读法:
Ruby代码
product.line_items(:refresh).size
Ruby代码
class Order < ActiveRecord::Base
has_one :paid_order,
:class_name =>"Order",
:foreign_key => "order_id",
:conditions => "paid_on is not null"
class Order < ActiveRecord::Base has_one :paid_order, :class_name =>"Order", :foreign_key => "order_id", :conditions => "paid_on is not null"
在表格上加order_id (表格名单数_id)
Ruby代码
class Invoice < ActiveRecord::Base
belongs_to :order
class Invoice < ActiveRecord::Base belongs_to :order
可选参数:class_name, :foreign_key, order, :conditions
Ruby代码
:dependent => true #删除主表行时同时删除子行
自定义的order用法:
class Customer < ActiveRecord::Base
has_many :orders
has_one :most_recent_order,
:class_name => 'Order',
:order => 'created_at DESC'
end
:dependent => true #删除主表行时同时删除子行 自定义的order用法: class Customer < ActiveRecord::Base has_many :orders has_one :most_recent_order, :class_name => 'Order', :order => 'created_at DESC' end
主.从 将被保存
Ruby代码
an_invoice = Invoice.new(...)
order.invoice = an_invoice # invoice被保存
an_invoice = Invoice.new(...) order.invoice = an_invoice # invoice被保存
从.主 将要手动保存
新增加的方法:
Ruby代码
product(force_reload=false)
product=(obj)
build_product(attributes={})
create_product(attributes={})
product(force_reload=false) product=(obj) build_product(attributes={}) create_product(attributes={})
一对多关系(one-to-many)
Ruby代码
class Order < ActiveRecord::Base
has_many :line_items
class Order < ActiveRecord::Base has_many :line_items
可选参数除了上面的,还有:exclusively_dependent, :finder_sql,:counter_sql
:exclusively_dependent 在子行没有其它表格瓜葛的情况下使用, 加快处理速度.
:finder_sql的使用实例:
Ruby代码
class Order < ActiveRecord::Base
has_many :rails_line_items,
:class_name => "LineItem",
:finder_sql => "select l. * from line_items l, products p " +
" where l.product_id = p.id " +
" and p.title like '%rails%'"
end
class Order < ActiveRecord::Base has_many :rails_line_items, :class_name => "LineItem", :finder_sql => "select l. * from line_items l, products p " + " where l.product_id = p.id " + " and p.title like '%rails%'" end
order的用法:
Ruby代码
class Order < ActiveRecord::Base
has_many :line_items,
:order =>"quantity, unit_price DESC"
end
class Order < ActiveRecord::Base has_many :line_items,
:order =>"quantity, unit_price DESC"
end
主.从 将被保存
Ruby代码
an_invoice = Invoice.new(...)
order.invoices <<an_invoice # invoice
class LineItem < ActiveRecord::Base
belongs_to :order
. . .
an_invoice = Invoice.new(...) order.invoices <<an_invoice # invoice class LineItem < ActiveRecord::Base belongs_to :order . . .
has_many后可以引用集合:
Ruby代码
order = Order.find(123)
total = 0.0
order.line_items.each do |li|
total += li.quantity * li.unit_price
end
order = Order.find(123) total = 0.0 order.line_items.each do |li| total += li.quantity * li.unit_price end
新增加的方法:
Ruby代码
orders(force_reload=false)
orders <<order
orders.push(order1, ...)
orders.delete(order1, ...)
orders.clear
orders.find(options...)
orders.build(attributes={})
orders.create(attributes={})
orders(force_reload=false) orders <<order orders.push(order1, ...) orders.delete(order1, ...) orders.clear orders.find(options...) orders.build(attributes={}) orders.create(attributes={})
多对多关系(many-to-many):
Ruby代码
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
#. . .
class Category < ActiveRecord::Base
has_and_belongs_to_many :products
#. . .
class Product < ActiveRecord::Base has_and_belongs_to_many :categories #. . . class Category < ActiveRecord::Base has_and_belongs_to_many :products #. . .
要创建一个中间表格:
categories_products
两表格名字复数形式相联, 排字母前后排序
表格内连关联键
略
预载子表
用:include将子表内容加入内存,提高查询速度, 但损耗内存:
Ruby代码
for post in Post.find(:all, :include => [:author, :comments])
puts "Post: #{post.title}"
puts "Written by: #{post.author.name}"
puts "Last comment on: #{post.comments.first.created_on}"
end
for post in Post.find(:all, :include => [:author, :comments]) puts "Post: #{post.title}" puts "Written by: #{post.author.name}" puts "Last comment on: #{post.comments.first.created_on}" end
自动计算子表行数
belongs_to加参数:
Ruby代码
counter_cache => true
counter_cache => true
数据库加 子表格名(复数)_count 段, 并加 :default=>0参数.
然后用 .size可以读取子表行数.
刷新数据读法:
Ruby代码
product.line_items(:refresh).size
相关文章推荐
- SAP销售和财务数据库表之间的关系
- SAP销售和财务数据库表之间的关系
- Model层生成各数据库表之间的关系
- NHibernate中实体类、Mapping配置文件与数据库表之间的关系
- Flask从入门到精通之数据模型之间的关系
- 数据库表之间的数据导入 sql语句
- rails与mysql之间中文数据显示不一致的问题
- 数据库表之间的数据导入
- 父子进程之间的数据拷贝关系
- VB与C++之间数据类型的对应关系
- JavaScript数据类型和数据类型之间的转换关系
- 人工智能、机器学习和数据挖掘三者之间的关系
- 数据库表之间的情书【转】
- 不同数据库表之间表数据复制
- valuestack,stackContext,ActionContext.之间的关系以及action的数据在页面中取得的方法
- SAP系统前台数据与后台表之间的关系浅谈
- 回复网友提问:云计算,大数据,数据库,数据仓库之间是什么关系
- 简述数据仓库、OLAP、数据挖掘之间的关系
- 韦恩图——帮助你更好地表达多个数据集合之间的相交关系
- Rails开发实录:建立用户与信息之间的关系