`
jbf034
  • 浏览: 152383 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多
对于表中的一个记录连接同一个表中的另一个记录也是可能发生的。举个例子,公司里
每一个雇员有一个manager 和一个mentor,这两个也是雇员。在Rails 你可以这样建模。
class Employee < ActiveRecord::Base
belongs_to :manager,
:class_name => "Employee",
:foreign_key => "manager_id"
belongs_to :mentor,
:class_name => "Employee",
:foreign_key => "mentor_id"
has_many :mentored_employees,
:class_name => "Employee",
:foreign_key => "mentor_id"
has_many :managed_employees,
:class_name => "Employee",
:foreign_key => "manager_id"
end
让我们加载一些数据。Clem 和Dawn 每个都一个mamager 和一个mentor。
Employee.delete_all
adam = Employee.create(:id => 1, :name => "Adam")
beth = Employee.create(:id => 2, :name => "Beth")
clem = Employee.new(:name => "Clem")
clem.manager = adam
clem.mentor = beth
clem.save!
dawn = Employee.new(:name => "Dawn")
dawn.manager = adam
dawn.mentor = clem
dawn.save!
然后,我们可以看看关系,回答这样的问题,“谁是X 的mentor?”和“哪个雇员是Y
的manager?“
p adam.managed_employees.map {|e| e.name} # => [ "Clem", "Dawn" ]
p adam.mentored_employees # => []
p dawn.mentor.name # => "Clem"
你也可能看到关系的不同用法。它在243 页描述。
Preloading Child Rows
正常情况下Active Record 都会推后加载数据库的子记录,一直到他们要用到的时候。
例如,
class Post < ActiveRecord::Base
belongs_to :author
has_many :comments,rder => 'created_on DESC'
end
如果我们迭代posts,访问author 和comment 属性,我们将使用一个SQL 查询,它返回
posts 表中n 行记录,又从authors 和comments 表中得到相关的记录,总共2n+1 次查询。
for post in Post.find(:all)
puts "Post: #{post.title}"
puts "Written by: #{post.author.name}"
puts "Last comment on: #{post.comments.first.created_on}"
end
这种性能问题有时使用find()方法的:include 参数选项来解决。当这个查询完成时,它
列出被预先加载的关联表。Active Record 是以一种比较聪明的方式来处理所有的数据都在
一个单一的SQL 查询里返回。如果有100 个posts,下面的代码将会消除这100 个查询的性
能。
for post in Post.find(:all, :include => :author)
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
这种预加载并不保证一定会提高性能。[事实上,它可能不会工作!如果你的数据库不支
持左侧连接的话,你就不能使用这个特性。例如,Oracle8 的用户将需要更新到9 来使用预
加载。]它连接查询中的所有表,返回很多数据,这些数据转换成Active Record 对象。如果
你的应用程序不使用额外的信息,你将会为此付出代价。如果你父表包含很多很多记录的话,
你可能也会碰到问题-与一行一行的懒加载相比。预加载的技术是要消耗很多服务器内存。
如果使用:include,你将需要确定用在find()的参数中的所有列名-每个前面都以表名
作为前缀。在下面例子中,条件句中的title 列要有表名作前缀来让查询成功。
for post in Post.find(:all, :conditions => "posts.title like '%ruby%'",
:include => [:author, :comments])
# ...
end
分享到:
评论

相关推荐

    宽带自动连接软件

    Windows 7同样支持创建和管理宽带连接,但为了实现自动连接,用户需要在“网络和共享中心”中设置宽带连接属性,勾选“连接后在通知区域显示图标”和“允许计算机关闭此设备以节约电源”选项,并在“高级设置”中将...

    SQL 连接 JOIN 例解左连接,右连接,全连接,内连接,交叉连接,自连接

    本文将详细介绍六种主要类型的 JOIN:左连接(LEFT JOIN)、右连接(RIGHT JOIN)、全连接(FULL JOIN)、内连接(INNER JOIN)、交叉连接(CROSS JOIN)以及自连接(SELF JOIN)。通过实例讲解每种连接的特点和应用...

    android 指定wifi热点自动连接

    注意,由于安全和权限问题,自Android 6.0(API级别23)起,你还需要在运行时请求`ACCESS_FINE_LOCATION`和`CHANGE_WIFI_STATE`权限。在AndroidManifest.xml中添加以下权限: ```xml ``` 在`AndroidManifest.xml...

    GPRS 自动连接 网络连接 代码

    在IT行业中,GPRS(General Packet Radio Service)是一种基于GSM网络的数据通信技术,它为移动设备提供了持续的在线连接,使得数据传输更加高效。在Windows CE(WinCE)操作系统上,开发GPRS自动连接功能对于实现...

    车机连接CarLife时自动连接手机蓝牙功能当前现状

    "车机连接CarLife时自动连接手机蓝牙功能当前现状" 车机连接CarLife时自动连接手机蓝牙功能是指车机在连接CarLife时,是否可以自动连接手机的蓝牙功能。下面我们将详细介绍 Android 和 iPhone 手机在连接CarLife时...

    Android自动连接已经配置好的wifi

    在Android系统中,实现自动连接已配置好的Wi-Fi网络是一项常用的功能,特别是在设备启动或进入特定范围时。本文将深入探讨这一主题,基于提供的标题、描述以及相关标签,讲解如何在Android应用中实现这一功能。 ...

    PB12断网后自动连接

    标题“PB12断网后自动连接”涉及的是PowerBuilder(PB)开发环境中的一项功能,该功能使得应用程序在遭遇网络中断后能够自动尝试重新建立连接。PowerBuilder是Sybase(现为SAP公司的一部分)开发的一种面向对象的...

    检测本地连接并自动连接宽带连接

    假设你的宽带连接已在网络连接中建立好, 仅在第一次运行时, 需要输入宽带的配置信息, 以后将自动读取已保存的配置(在文件%windir%\autoADSL.cmd内)进行自动连接, 无需再次干预 ... @echo off if "%1" == "h" goto ...

    Android例子源码自动连接已经配置好的指定的wifi的简单例子

    本项目是一个实现自动连接指定的wifi的功能,可以检测要连接的wifi是否在可连接范围内,若在可连接范围内,则进行连接;否则提醒用户,程序结束。注意:此处要连接的wifi是已经配置好的,就是之前已经连接过的。程序...

    LabVIEW TCP 通讯 自动连接 掉线自动重连

    - **连接管理**:服务器需要跟踪每个客户端连接的状态,以便在必要时断开连接或处理多个并发连接。 3. **掉线查询与重连策略**:为了实现“掉线查询”和“掉线重连”,我们需要在客户端和服务器端都加入心跳机制。...

    数据库自连接应用范例(Oracle)

    数据库自连接是数据库查询中的一种特殊技巧,尤其在Oracle数据库中有着广泛的应用。自连接允许一个表自身与其进行连接操作,这在处理复杂的数据关系时非常有用,例如查询上下级关系、查找共同属性或者实现某种特定的...

    hibernate 自连接 emp例子

    在这个特定的例子中,我们关注的是如何在Hibernate中实现自连接查询,以处理Oracle数据库中EMP表的树状结构问题。 首先,自连接查询是指一个表与自身进行连接的操作,常用于处理具有层级关系的数据,例如员工的上...

    wifidemo自动连接wifi

    在Android平台上,实现“wifidemo自动连接WiFi”是一个常见的需求,特别是在开发物联网设备、智能家居或者需要在特定环境下自动连接网络的应用时。这个“wifidemo”可能是一个简单的示例项目,用于演示如何在Android...

    Android下自动连接指定SSID的WIFI的简单实现的demo

    在Android系统中,有时我们需要实现一个功能,使得设备能够自动连接到预设的特定SSID的WiFi网络,尤其在没有用户界面的智能设备上,这个功能显得尤为重要。本篇将详细介绍如何在Android环境下实现这一功能,并提供一...

    MySQL数据库:自连接.pptx

    在MySQL数据库中,自连接是一种特殊的表连接方式,它允许我们把同一个表当作两个不同的实体进行操作,通过为表提供别名,使我们能够在查询中比较同一张表的不同行。这种技术在处理复杂的关联查询或者查找具有特定...

    radmin自动连接器

    能够实现批量管理和自动连接功能,方便实用! 金山火眼报告: http://fireeye.ijinshan.com/analyse.html?md5=68a2362abbf8fba702a64a53cb396ffe&sha1=fb5002afcddb55356094773a00dc0912dd77c843&type=1

    win10自动连接WIFI的批处理文件.bat

    win10自动连接WIFI的批处理文件

    android 自动连接WIFI

    在Android平台上,自动连接Wi-Fi是一项实用的功能,尤其对于那些需要频繁访问特定Wi-Fi网络的用户来说。本文将深入探讨如何在Android应用中实现这一功能,以提高用户体验并简化重复的网络连接操作。 首先,我们需要...

    如何实现宽带自动连接

    如何实现宽带自动连接如何实现宽带自动连接如何实现宽带自动连接

Global site tag (gtag.js) - Google Analytics