Association
来源:互联网 发布:黄金走势分析软件 编辑:程序博客网 时间:2024/05/01 21:10
多态关联(polymorphic association,在migration的时候需要声明:polymorphic => true )
rails都会在赋值时自动把关联对象以及新的关联关系保存到数据库(除非特别使用build方法来告诉rails不要save),但belongs_to是个例外。原因是对于其它关联来讲,关联的key要么在一个中间表,要么在对方表上而belong_to外键存在于自身。
所有的associaiton方法,都是在最近查询的cache上操作,如果改变了数据,就需要重新reload这些数据。
在:conditions里面有其它表的字段出现。不管这个表是否出现在:include集里面(比如只出现在joins里面),rails的eager loading的查询方式都会变成用join的方式,来查出发起表自身和:include里面所有关联的结果集。分几种情况:
(1) 通过:include绑定了其它表,那么使用的是left outer join,并且结果集中会出现在这个表。
(2)通过:joins绑定了其他表,那么使用的join方式由自己指定,并且如果没有include这个关联,结果集不会出现在这个表的数据。
(3)如果同时被:include和:joins绑定,代表的是:需要eager loading这个关联,但使用由:joins指定的表关联方式。
例:Company.all(:include => :address, :joins => "INNER JOIN users ON users.company_id = companies.id", :conditions => "users.id in (1, 2)")
执行查询SELECT companies.id AS t0_r0, ...., addresses.id as t1_r0, ... FROM companies LEFT OUTER JOIN addresses ON addresses.id = companies.address_id INNER JOIN users ON users.company_id = companies.id WHERE users.id in (1, 2)
如果改变查询语句
Company.all(:include => :address, :joins => "INNER JOIN users ON users.company_id = companies.id AND users.id IN (1, 2)")
则执行查询
SELECT companies.* FROM companies INNER JOIN users
ON users.company_id = companies.id AND users.id in (1, 2)
SELECT * FROM addresses WHERE addresses.id in (...)
:include和:joins区别:includes会把一起连接表的所有字段都查询出来,放到内存里面。当你想取连接表的数据的时候,无须再查询数据库了。joins只会把主表的数据查询出来放在内存,如果需要查询连接表的数据,还必须再次查询数据库。
(预加载(Eager Loading Associations)官方文档
(http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations)
据说还有一种叫携带加载。。。。)
rails都会在赋值时自动把关联对象以及新的关联关系保存到数据库(除非特别使用build方法来告诉rails不要save),但belongs_to是个例外。原因是对于其它关联来讲,关联的key要么在一个中间表,要么在对方表上而belong_to外键存在于自身。
所有的associaiton方法,都是在最近查询的cache上操作,如果改变了数据,就需要重新reload这些数据。
在:conditions里面有其它表的字段出现。不管这个表是否出现在:include集里面(比如只出现在joins里面),rails的eager loading的查询方式都会变成用join的方式,来查出发起表自身和:include里面所有关联的结果集。分几种情况:
(1) 通过:include绑定了其它表,那么使用的是left outer join,并且结果集中会出现在这个表。
(2)通过:joins绑定了其他表,那么使用的join方式由自己指定,并且如果没有include这个关联,结果集不会出现在这个表的数据。
(3)如果同时被:include和:joins绑定,代表的是:需要eager loading这个关联,但使用由:joins指定的表关联方式。
例:Company.all(:include => :address, :joins => "INNER JOIN users ON users.company_id = companies.id", :conditions => "users.id in (1, 2)")
执行查询SELECT companies.id AS t0_r0, ...., addresses.id as t1_r0, ... FROM companies LEFT OUTER JOIN addresses ON addresses.id = companies.address_id INNER JOIN users ON users.company_id = companies.id WHERE users.id in (1, 2)
如果改变查询语句
Company.all(:include => :address, :joins => "INNER JOIN users ON users.company_id = companies.id AND users.id IN (1, 2)")
则执行查询
SELECT companies.* FROM companies INNER JOIN users
ON users.company_id = companies.id AND users.id in (1, 2)
SELECT * FROM addresses WHERE addresses.id in (...)
:include和:joins区别:includes会把一起连接表的所有字段都查询出来,放到内存里面。当你想取连接表的数据的时候,无须再查询数据库了。joins只会把主表的数据查询出来放在内存,如果需要查询连接表的数据,还必须再次查询数据库。
(预加载(Eager Loading Associations)官方文档
(http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations)
据说还有一种叫携带加载。。。。)
- Association
- Object Association
- Association Rules
- BLtoolkit : association
- Mybatis association
- mybatis association
- MyBaits association的使用、 association详解
- Association和dependency
- Use case association
- BLU-RAY DISC ASSOCIATION
- Association & Aggregation & Compositon 不同之处?
- Association Classes of UML
- Association, Aggregation, Composition
- association & composition & aggregation & generalization
- ODX - Aggregation, Composition, Association
- 802.11 Authentication and Association
- association,aggregation,composition有什麼差別?
- association多表查询
- 高并发下的 Nginx 优化方案
- Item 04 : Make sure that objects are initialized before they're used.
- VIOS 磁盘映射简介
- 项目部署到Tomat报异常:jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending ...
- sql server与oracle的互联
- Association
- [Android] Android开发优化之——对界面UI的优化(2)
- UDP有边界,一次一包;TCP是字节流,需要应用层自己判断包边界。
- 迭代器模式(Iterator Pattern)
- 运营商的“逆袭”或将令苹果雪上加霜
- mtk android tp 运行方式更改
- iPhone下xib转成iPad的xib
- Xcode的控制台调试命令
- 如何修改data guard 的“*.db_unique_name”参数