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)
据说还有一种叫携带加载。。。。)

原创粉丝点击