快速业务通道

真实世界中的Rails,第3部分: 优化ActiveRecord - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
可以使用相同的技术(而非继承)附加通用属性用于内容管理。考虑名为 ContentBase 的类。通常,为 了将该类关联到另一个类,可以使用 has_one 关系和一个简单的外键。但您可能更想让 ContentBase 能 与多个类共同工作。这时,您需要一个外键,还需要一个能定义目标类的类型的列。而这恰好是 ActiveRecord 多态关联所擅长的方面。请参看清单 11。

清单 11. 站点内容关系的两个方面

class Cause < ActiveRecord::Base
 has_one :content_base, :as => :displayable, :dependent => :destroy
 ...
end
class Nonprofit < ActiveRecord::Base
 has_one :content_base, :as => :displayable, :dependent => :destroy
 ...
end
class ContentBase < ActiveRecord::Base
 belongs_to :displayable, :polymorphic => true
end

通常,belongs_to 关系只有一个类,但 ContentBase 中的关系却是多态的。外键不仅具有 标识记录的标识符,而且还具有标识表的一个类型。使用这种技术,我获得了继承的诸多益处。常见的功 能在单一类中就都包括了。但这也带来了几个副作用。我无需将 Cause 和 Nonprofit 中的所有列都放在 单一表中。

一些数据库管理员不太看好多态关联,原因是他们不怎么使用真正意义上的外键,但 对于 ChangingThePresent,我们自由地使用了多态关联。实际上,数据模型并不像理论上那样美好。不 能使用诸如引用完整性这样的数据库特性,也不能依赖于工具来基于列的名称发现这些关系。简洁的对象 模型的好处对我们来说要比此方式所存在的问题更为重要。

create_table 

"content_bases", :force => true do |t|
 t.column "short_description",     :string
 ...
 t.column "displayable_type", :string
 t.column "displayable_id",  :integer
end

结束语

ActiveRecord 是一种功能完善的持久性框架。用它可以构建可伸缩的可靠系 统,但与其他数据库框架一样,您必须要格外注意框架所生成的 SQL。当偶尔遇到问题时,您必须调整自 己的方式和策略。保留索引、借助 include 使用热加载和在某些地方使用多态关联代替继承是三种可用 来改进代码库的方法。在下月,我将带您亲历另一个示例去领略如何编写真实世界中的 Rails。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号