`
jbf034
  • 浏览: 154296 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

acts as list/acts as tree

阅读更多
Acts As List

在子表中使用acts_as_list,便能从父表的“视图”中得到像子表的行为。父表将能够
遍历子表,在列表内移动子表,或从列表内移除子表。
通过给每个子表一个位置数来实现列表。这意味着子表必须有个列来记录此位置。如果
我们称它为列position,Rails 会自动使用它。如果不这么称呼它,我们需要告诉Rails 它
的名字。对于我们的例子,跟随父表之后我们将创建一个新的子表(叫children)。
create table parents (
id int not null auto_increment,
primary key (id)
);
create table children (
id int not null auto_increment,
parent_id int not null,
name varchar(20),
position int,
constraint fk_parent foreign key (parent_id) references parents(id),
primary key (id)
);
接着,我们将创建“模型”类。注意在Parent 类中,我们基于当前的position 列的值
来确定我们children 的位置。这确保从数据库内获得的数组在正确的定单清单内。
class Parent < ActiveRecord::Base
has_many :children,rder => :position
end
class Child < ActiveRecord::Base
belongs_to :parent
acts_as_list :scope => :parent_id
end
在Child 类中,我们用传统的belongs_to 声明来建立与父表的连接。我们也有个
acts_as_list 声明。我们用一个:scope 选项来限制它,指定列表的每个父表。没有这范围操
作符,则对于children 表内的所有条目则只有一个全局的列表。
现在我们设一些测试用数据:我们为一个特定的父项创建四个子项,称为One,Two,Three
和Four。
parent = Parent.new
%w{ One Two Three Four}.each do |name|
parent.children.create(:name => name)
end
parent.save
我们要写个简单的方法来检查列表的内容。
def display_children(parent)
puts parent.children.map {|child| child.name }.join(", ")
end
在完成我们列表的测试后。注释显示了由display_children()产生的输出。
display_children(parent) #=> One, Two, Three, Four
puts parent.children[0].first? #=> true
two = parent.children[1]
puts two.lower_item.name #=> Three
puts two.higher_item.name #=> One
parent.children[0].move_lower
parent.reload
display_children(parent) #=> Two, One, Three, Four
parent.children[2].move_to_top
parent.reload
display_children(parent) #=> Three, Two, One, Four
parent.children[2].destroy
parent.reload
display_children(parent) #=> Three, Two, Four
注意我们是如何在父项中调用reload()的。各种move_method 更新数据库内子项,但因
为它们直接操作子项,父项将不会立即知道这一更改。
list 库使用术语lower 和higher 来引用元素的相对位置。Higher 意味着离列表前部近,
lower 离尾部近。顶部也与前部是一个意思,底部与尾部是一个意思。方法move_higher( ),
move_lower( ), move_to_bottom( ), 和move_to_top( ) 在list 内循环移动一个特定项
目,并自动调整与其它元素的位置。
higher_item( ) 和lower_item( ) 返回相对于当前元素的下一个和前一个元素的位
置, first?( ) 和last?( ) 在list 内的当前元素位于前部或尾部时返回true 。
新近创建的子项被自动地添加到列表的尾部。当一个子行被删除时,list 内的子项会被
移除并用gap 填充。


Acts As Tree

“活动记录”提供对组织一个表内的行到一个层次,或树,结构中的支持。这对创建具
有子项的项目很有用处,并且这些子项还可以有它自己的子项。分类目录列表通常有这种结
构,如对许可证,目录清单等等的描述。
这种类似树的结构可通过向表中添加一个单独的列(缺省称为parent_id)来做到。这个
列是个引用自身表的外键,链接子行到它们的父行。图15.1 演示了它。
要显示出树是如何工作的,让我们创建个简单的分类表,每个顶层分类有子分类,每个
子分类可以添加子分类层。注意外键指回到自身表中。
create table categories (
id int not null auto_increment,
name varchar(100) not null,
parent_id int,
constraint fk_category foreign key (parent_id) references
categories(id),
primary key (id)
);
相应的“模型”使用带有种类名字acts_as_tree 的方法来指出这种关系。:order 参数
意味着当我们查找特定节点的子项时,我们会看到它们按它们名字列被重新排列。
class Category < ActiveRecord::Base
acts_as_treerder => "name"
end
通常你得有一些最终用户功能来创建和管理分类层次。这儿,我们只使用创建它的代码。
注意我们如何使用子项属性来管理任何节点的子项。
root = Category.create(:name => "Books")
fiction = root.children.create(:name => "Fiction")
non_fiction = root.children.create(:name => "Non Fiction")
non_fiction.children.create(:name => "Computers")
non_fiction.children.create(:name => "Science")
non_fiction.children.create(:name => "Art History")
fiction.children.create(:name => "Mystery")
fiction.children.create(:name => "Romance")
fiction.children.create(:name => "Science Fiction")
现在我们做好了所准备工作,我们可以试用树结构了。我们使用我们用于list 代码的
display_children()方法。
display_children(root) # Fiction, Non Fiction
sub_category = root.children.first
puts sub_category.children.size #=> 3
display_children(sub_category) #=> Mystery, Romance, Science Fiction
non_fiction = root.children.find(:first, :conditions => "name = 'Non
Fiction'")
display_children(non_fiction) #=> Art History, Computers, Science
puts non_fiction.parent.name #=> Books
我们用于操纵子项的各种方法看起来很熟悉:它们与提供给has_many 的是一样的。事实
上,如果我们看看acts_as_tree 的实现,我们将看到这做的所有事情都是构建在belongs_to
和has_many 属性上,每个都指回自身表。就像我们写的一样。
class Category < ActiveRecord::Base
belongs_to :parent,
:class_name => "Category"
has_many :children,
:class_name => "Category",
:foreign_key => "parent_id",
:order => "name",
:dependent => true
end
如果你需要优化子项大小的性能,你可以构建一个counter 缓存(就好像你在用
has_many)。添加选项:counter_cache => true 给acts_as_tree 声明,添加列
children_count 给你的表。
分享到:
评论

相关推荐

    a project model for the FreeBSD Project.7z

    The FreeBSD release tree 4-3. The overall development model 5-1. Overview of official hats 6-1. Process summary: adding a new committer 6-2. Process summary: removing a committer 6-3. Process summary...

    VB编程资源大全(英文源码 控件)

    Please read Readme.txt&lt;END&gt;&lt;br&gt;26 , LOVDLL.zip It will act as List Of Values. You might have seen List Of Values in Developer. It will act same as that.&lt;END&gt;&lt;br&gt;27 , WCodeDll.zip COOL Small DLL...

    VB编程资源大全(英文源码 控制)

    listtxt.zip This shows how to retrieve the text from the current selection in a listbox.&lt;END&gt;&lt;br&gt;11 , list_index.zip This example tells you if the inputted List Index is selected or not.&lt;END&gt;...

    servlet2.4doc

    Overview Package Class Tree Deprecated Index Help PREV NEXT FRAMES NO FRAMES A B C D E F G H I J L P R S U V -------------------------------------------------------------------------------- A ...

    芋道 yudao ruoyi-vue-pro pay sql , 更新时间 2024-08 ,可对应yudao版本2.4.1

    芋道 yudao ruoyi-vue-pro pay sql , 更新时间 2024-08 ,可对应yudao版本2.4.1

    手势识别_CNN_训练测试_问题解决技巧_1741785490.zip

    图像处理项目实战

    中国民营科技促进会2023中国大数据企业排行榜V8.0大数据产业白皮书110页.pdf

    中国民营科技促进会2023中国大数据企业排行榜V8.0大数据产业白皮书110页.pdf

    java-springboot+vue大药房管理系统实现源码(项目源码-说明文档).zip

    系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

    车辆识别_深度学习_图像预处理_实际应用CarModelRe_1741786237.zip

    图像处理项目实战

    一周入门 UE 开发教程背景知识

    一周入门 UE 开发教程背景知识

    车辆识别_深度学习_车牌检测与识别_OpenCV部署dete_1741774462.zip

    车牌识别项目

    Kubernetes K8s架构师实战.zip

    目录: 第 1 章:Ansible 自动化部署 K8S 集群【内含6个文件】 第 2 章:弹性伸缩【内含4个文件】 第 3 章:Helm 应用包管理器(v3)【内含3个文件】 第 4 章:K8S 集群网络【内含1个文件】 第 5 章:K8S 存储 之 Ceph 分布式存储系统【内含4个文件】 第 6 章:微服务容器化迁移【内含3个文件】 第 7 章:基于 K8S 构建企业 Jenkins CICD 平台(微服务)【内含4个文件】 第 8 章:服务治理 Istio 初探【内含1个文件】 网盘文件永久链接

    基于Springboot框架的网上在线点餐系统平台的设计和实现(完整源码+完整毕设文档+数据库文件+ppt).zip

    第一章 绪 论 1 1.1背景及意义 1 1.2国内外研究概况 2 1.3 研究的内容 2 第二章 关键技术的研究 3 2.1 相关技术 3 2.2 Java技术 3 2.3 ECLIPSE 开发环境 4 2.4 Tomcat介绍 4 2.5 Spring Boot框架 5 第三章 系统分析 5 3.1 系统设计目标 6 3.2 系统可行性分析 6 3.3 系统功能分析和描述 7 3.4系统UML用例分析 8 3.4.1管理员用例 9 3.4.2用户用例 9 3.5系统流程分析 10 3.5.1添加信息流程 11 3.5.2操作流程 12 3.5.3删除信息流程 13 第四章 系统设计 14 4.1 系统体系结构 15 4.2 数据库设计原则 16 4.3 数据表 17 第五章 系统实现 18 5.1用户功能模块 18 5.2管理员功能模块 19 5.3美食店功能模块 19 5.4前台首页功能模块 19 第六章 系统测试 20 6.1测试定义及目的 21 6.2性能测试 22 6.3测试模块 23 6.4测试结果 24 总 结 26 致 谢 27 参考文献 28

    33559399361500导师评价.zip

    33559399361500导师评价.zip

    前端后端修改改进第一次

    前端后端修改改进第一次

    网络安全是指通过技术、管理和法律手段保护网络系统、数据及用户隐私,防止未经授权的访问、攻击和信息泄露,确保可用性、完整性和机密性

    网络安全是通过技术手段、管理策略和法律规范,保护网络系统、数据及用户隐私免受未经授权的访问、攻击或泄露,确保网络服务的可用性、数据的完整性和机密性。其核心内容包括: 1. 技术防护:如防火墙、入侵检测系统(IDS)、加密通信、漏洞修复等。 2. 管理措施:包括安全策略制定、访问控制、安全审计、应急响应等。 3. 法律与合规:遵循《网络安全法》《数据安全法》等法规,保障用户隐私与国家安全。 4. 安全意识:提升用户对钓鱼攻击、密码安全等风险的防范能力。 # 适用人群 - 企业/组织:IT运维人员、安全管理员、开发工程师(需保障业务系统安全)。 - 普通用户:需防范个人信息泄露、网络诈骗等风险。 - 政府与公共部门:确保关键基础设施(如电力、金融、通信)的安全运行。 - 教育领域:学生及教师需了解基础安全知识以应对网络威胁。 # 适用场景及目标 1. 企业场景: - 目标:防御黑客攻击、数据泄露、勒索软件等,保障业务连续性。 - 措施:部署网络隔离、多因素认证、定期渗透测试。 2

    基于C#的调用今日头条API并写入数据库 源码.zip

    需要将源码中的key换成正式的key方可使用

    幼儿园教师儿童行为观察:困惑与思考.docx

    幼儿园教师儿童行为观察:困惑与思考

    RAG-Adapter:一种即插即用的RAG增强框架,用于长视频理解

    多模态大语言模型(MLLMs)具备视频理解能力,正在迅速发展。为了有效评估其视频理解能力,提出了针对长视频理解的基准测试,如Video-MME和MLVU。然而,这些基准直接使用均匀帧采样进行测试,导致信息大量丢失,影响了评估结果对MLLMs真实能力的准确性。为此,我们提出了一种称为RAG-Adapter的即插即用框架,通过采样与给定问题最相关的帧来减少测试期间的信息损失。此外,我们引入了一种分组监督对比学习(GCL)方法,以进一步通过在我们构建的MMAT数据集上的微调来提高RAG-Adapter的采样效果。最后,我们在各种视频理解基准上测试了多个基线MLLMs,发现RAG-Adapter采样始终优于均匀采样(例如,GPT-4o在Video-MME上的准确率提高了9.3%),为长视频基准提供了一种更准确的测试方法。

    智慧工业园区大数据云平台建设方案Word(321页).docx

    在当今数字化浪潮中,园区智慧化建设正成为推动区域经济发展和产业转型升级的关键力量。这份园区智慧化解决方案全面展示了如何通过集成大数据、云计算、物联网(IoT)、人工智能(AI)、地理信息系统(GIS)和建筑信息模型(BIM)等前沿技术,为传统产业园区插上数字的翅膀,打造“数字创新”产业园区。 数字技术赋能,重塑园区生态 传统产业园区往往面临运营效率低下、管理粗放、资源利用率不高等问题。而通过智慧化改造,园区可以实现从“清水房”到“精装房”的华丽蜕变。数字化技术不仅提升了园区的运营管理水平,降低了运营成本,还显著增强了园区的竞争力和吸引力。例如,通过构建园区数字模型(CIM),实现了多规数据融合,形成了园区规划“一张图”,为园区管理提供了直观、高效的可视化工具。此外,智能感知设施的应用,如环境监测、能耗监测等,让园区管理更加精细化、科学化。智慧能源管理系统通过实时监测和智能分析,帮助园区实现低碳绿色发展,而综合安防管控系统则通过AI+视频融合技术,为园区安全保驾护航。更有趣的是,这些技术的应用还让园区服务变得更加个性化和便捷,比如园区移动APP,让企业和员工可以随时随地享受园区服务,从会议室预定到智慧公寓管理,一切尽在“掌”握。 智慧运营中心,打造园区大脑 园区智慧化建设的核心在于构建智慧运营中心,这可以看作是园区的“数字大脑”。通过集成物联网服务平台、大数据分析平台、应用开发赋能平台等核心支撑平台,智慧运营中心实现了对园区内各类数据的实时采集、处理和分析。在这个“大脑”的指挥下,园区管理变得更加高效、协同。比如,建设工程项目智慧监管系统,通过基于二三维GIS底图的统一数字化监管,实现了对园区在建工程项目的进度控制、质量控制和安全控制的全方位监管。可视化招商系统则利用CIM模型,以多种方式为园区对外招商推介提供了数字化、在线化的展示窗口。而产业经济分析系统,则通过挖掘和分析产业数据,为园区产业发展提供了有力的决策支持。智慧运营中心的建设,不仅提升了园区的整体运营水平,还为园区的可持续发展奠定了坚实基础。 产业服务升级,激发创新活力 园区智慧化建设不仅关注基础设施和运营管理的升级,更重视产业服务的创新。通过整合平台资源、园区本地资源和外围资源,打造园区服务资源池,为园区内的企业和个人提供了全面的智慧管理、智慧工作和智慧生活服务。特别是工业互联网平台和工业云服务的建设,为园区内的企业提供了轻量化、智能化的生产服务。这些服务涵盖了车间信息化管理、云制造执行、云智能仓储、设备健康管理等多个方面,有效提升了企业的生产效率和竞争力。此外,通过产业经济分析系统,园区还能够对潜在客户进行挖掘、对经销商进行风控、对产品销量进行预测等,为企业的市场营销提供了有力支持。这些创新的产业服务,不仅激发了园区的创新活力,还为区域经济的转型升级注入了新的动力。总之,园区智慧化建设是一场深刻的变革,它正以前所未有的方式重塑着园区的生态、运营和服务模式,为园区的可持续发展开辟了广阔的前景。

Global site tag (gtag.js) - Google Analytics