`
xu_wccq
  • 浏览: 130911 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用include中嵌Hash取出一个多层次的对象关联数据

    博客分类:
  • ruby
阅读更多
使用include中嵌Hash取出一个多层次的对象关联数据.

首先有如下关系:
project issue  : 一对多
issue comment : 一对多
comment history : 一对多
Project [1] <---- [n] issue (1) <---- (n) comment [1] <---- [n] history


class Project
  has_many :issues
end


class Issue
  belongs_to :project
  has_many :cccc      # cccc  为了区别后面的名称不致混淆

#在issue中创建一条与之对应的comment,这里用实例变量为了方便在issue保存的时候也一同保存comment的信息。
  def init_comment(content = "")
    @current_comment ||= Comment.new(:resource => self, :creater => current_user, :content => content)
    @issue_before_change = self.clone
    @current_comment
  end
  
#issue保存的时候一同保存comment,以及histories的信息。
##这里需要注意的是,要保证histories表中的comment_id(histories表中与comment关联的外键) `comment_id` int(11) default '0', 必需设置一个默认值,否则将不能保存comment 和 history的信息。
  def before_save
    if @current_comment
      # attributes changes
      (Issue.column_names - %w(id content resource_id resource_type)).each {|c|
        @current_comment.histories << History.new(:property=>c,
                                                  :comment => @current_comment,
                                                  :old_value => @issue_before_change.send(c),
                                                  :value => send(c)) unless send(c)==@issue_before_change.send(c)
      }
      @current_comment.save
    end
    # Save the issue even if the comment is not saved (because empty)
    true
  end

end


class Comment
  belongs_to :issue
  has_many :histories
end


class History
  belongs_to :comment
end


一条语句实现取出这其中的所有记录:
Project.find(:first,:include =>[{ :issue => { :cccc => { :histories => :comment }}}]
注意,include中的关联的名称要对应好。


API 中的相关使用介绍
To include a deep hierarchy of associations, use a hash:

  for post in Post.find(:all, :include => [ :author, { :comments => { :author => :gravatar } } ])

That‘ll grab not only all the comments but all their authors and gravatar pictures. You can mix and match symbols, arrays and hashes in any combination to describe the associations you want to load.

All of this power shouldn‘t fool you into thinking that you can pull out huge amounts of data with no performance penalty just because you‘ve reduced the number of queries. The database still needs to send all the data to Active Record and it still needs to be processed. So it‘s no catch-all for performance problems, but it‘s a great way to cut down on the number of queries in a situation as the one described above.

Since the eager loading pulls from multiple tables, you‘ll have to disambiguate any column references in both conditions and orders. So :order => "posts.id DESC" will work while :order => "id DESC" will not. Because eager loading generates the SELECT statement too, the :select option is ignored.

You can use eager loading on multiple associations from the same table, but you cannot use those associations in orders and conditions as there is currently not any way to disambiguate them. Eager loading will not pull additional attributes on join tables, so "rich associations" with has_and_belongs_to_many are not a good fit for eager loading.

When eager loaded, conditions are interpolated in the context of the model class, not the model instance. Conditions are lazily interpolated before the actual model exists. 

分享到:
评论

相关推荐

    JS Hash对象

    在JavaScript中,Hash对象并不是内置的数据结构,但这个术语通常用来描述一个对象,其属性名可以是任何类型,而不仅仅是字符串。在JavaScript的世界里,对象本质上就是一个键值对(key-value pairs)的集合,这些键...

    geohash:一个解决计算附近距离的php类库

    5. **整合进业务逻辑**:将`geohash`与你的应用程序结合,例如在用户注册时记录他们的位置,然后在搜索或推荐场景中使用`geohash`进行高效的定位服务。 总的来说,`geohash`为PHP开发者提供了一种强大的工具,它...

    HASH_hash_stm32hash_stm32hash表_stm32f407_

    在STM32F407上实现的哈希(Hash)算法是数字签名、数据完整性验证等安全应用中的关键组成部分。哈希算法能够将任意长度的输入数据转化为固定长度的输出,通常称为哈希值或消息摘要。 哈希算法的主要特性包括: 1. *...

    uthash开源的hash函数实现

    UTHASH 是一个开源的 C 语言库,提供了一种简单且高效的哈希表实现,用于在 C 代码中快速查找和管理数据结构。这个库的主要功能是提供一个宏定义的集合,可以方便地将结构体转化为哈希表,进而进行添加、删除、查找...

    HASHIN.rar_ABAQUS_Hashin失效准则 abaqus_abaqus hashin_abaqus 三维Hashi

    标题中的"HASHIN.rar_ABAQUS_Hashin失效准则 abaqus_abaqus hashin_abaqus 三维Hashi"表明这是一个关于ABAQUS软件中应用Hashin失效准则进行三维分析的示例或教程。ABAQUS是一款广泛应用的有限元分析软件,尤其在结构...

    Go-fasthashgo写的一个hash算法比标准hash算法的速度更快占用内存更低

    同时,查看示例代码或测试用例可以帮助你更好地理解如何在自己的项目中使用`fasthash`。 总的来说,`fasthash`是一个针对Go语言的高性能哈希库,它为开发者提供了在速度和内存效率之间取得平衡的选项。如果你的项目...

    使用Hash散列从海量IP地址中查找IP地址

    标题中的“使用Hash散列从海量IP地址中查找IP地址”是一个关于数据结构与算法的实践应用,主要涉及如何高效地在大量IP地址中进行查找操作。在这个问题中,使用了哈希(Hash)技术,它是一种将任意大小的数据映射到...

    hash树的建立和在数据挖掘中的应用

    2. **初始化哈希表**:创建一个大小足够的数组,用于存储关键字及其关联的数据。 3. **插入关键字**:对每个待插入的关键字,通过哈希函数计算其哈希值,然后在哈希表对应的位置存储该关键字和相关数据。如果遇到...

    nodejs geohash

    结合这两个概念,"nodejs geohash"指的是在Node.js环境中使用Geohash技术来处理地理位置数据。 Geohash是一种将地理坐标(经度和纬度)转换为可存储和检索的字符串的方法。这个字符串代表了坐标在网格中的位置,...

    115、关联关系数据的嵌套显示1

    在有些情况下,我们希望嵌套关系的数据必须使用 IRI,我们可以添加另外一个注解 ApiProperty,在 ApiProperty 中我们设置 readableLink 为 false。这样具有嵌套关系的数据将会强制的显示为 IRI 字符串。 在 Post 类...

    MD5校验工具Hash.exe使用说明.pdf

    Hash.exe 是一个 MD5 校验工具,由浪潮电子信息产业股份有限公司开发,用于确保发布的 FW 版本及下载使用版本的一致性。本文档将详细介绍 Hash.exe 工具的使用说明和详细步骤。 一、Hash.exe 工具概述 Hash.exe ...

    package hash

    标题中提到了“package hash”,这表明本知识点将以R语言的一个特定包为核心,即hash包。在R语言中,包是扩展功能的主要方式,通过包,用户可以轻松地为R增加新的数据结构和功能。hash包特别提供了类似哈希表的数据...

    win8以上后缀关联userchoice计算hash值

    在Windows中,每个文件扩展名都可以与一个或多个应用程序关联。例如,`.txt`文件通常与记事本关联,`.docx`文件与Microsoft Word关联。当用户双击具有特定扩展名的文件时,Windows会根据该扩展名的关联启动相应的...

    Hash算法快速存取数据

    这种映射关系的特点是:每个实际的数据项只能对应一个唯一的键值,但一个键值可能对应多个实际的数据项。利用这种映射关系,可以在数组等数据结构中实现对数据的快速存取。 #### 三、Hash表的实现 下面是一个简单...

    oracle分区表之hash分区表的使用及扩展

    以下是一个示例,展示了如何查看已有的Hash分区表`COMMODITY`的分区信息,包括分区位置、分区名称和每个分区中的行数: ```sql SELECT TABLE_NAME, PARTITION_POSITION, PARTITION_NAME, NUM_ROWS FROM user_tab_...

    hash_map的详解

    让我们来看一个简单的例子,演示如何使用`hash_map`来存储整数ID和其相关信息: ```cpp #include &lt;hash_map&gt; #include #include using namespace std; int main() { hash_map, string&gt; idInfo; // 插入数据 ...

    如何找到周围8个区域的GeoHash编码

    - 你可以创建一个方法,接收一个GeoHash编码作为输入,然后返回其周围的8个邻居编码。 - 使用位运算符来高效地修改GeoHash编码的最后一位。 - 注意边界条件,确保修改后的编码仍然是有效的GeoHash编码。 以上...

    数据库中如何用Hash关键字提高数据库性能

    应用称为hash关键字(引用单独一个hash)或hash桶(一个hash关键字集合)的字符串目录的优秀方法可大大节省磁盘空间并提高性能。hash是应用一个指定字符串算法的整数结果。有各式各样的hash算法,但最常用的是内置的...

Global site tag (gtag.js) - Google Analytics