我有一张叫做 Bookings 的表。该表包含代表针对特定服务进行的预订的数据,其中包含许多变量。
不久前,我遇到了当前数据结构的一个问题,即任何影响时间、日期或价格的预订更改都会影响其他相关的财务记录、日期预订列表等。
我当时的解决方案是创建一个修改表,用于跟踪对预订所做的任何更改。然后,每当 Booking 模型被要求返回预订时,它都会添加修改(在 afterFind() Cake 回调中)并呈现预订的最新版本,类似这样(请原谅 Paint 绘图):

当您要求预订模型返回预订 #1234 时,此方法工作正常。它返回预订的最新表示,包括所有修改(相互叠加),包括一个包含所有修改的数组 和 原始预订数据以供引用。
我的问题 是我最近意识到我需要能够使用自定义条件查询此模型,并且如果在其中一项修改中实现了这些条件之一,则结果将不匹配,因为该模型正在搜索原始记录比最终呈现的记录。我查询模型以返回行的示例,其中 abc是蓝色(不是灰色):

在该示例中,模型直接查看行的原始数据,其中 abc是蓝色并且不返回此结果,因为蓝色值在附加的修改中 后 找到了原来的结果。
我现在所做的是将查询放入 beforeFind()预订模型的回调以查找与给定条件匹配的修改,加入预订以确保任何其他条件仍然匹配。当它在上面的例子中返回蓝色时,它将结果作为类属性存储在一个数组中,并继续使用常规 find() ,但是 不包括 该预订的 ID 被退回(因为我们找到了它的更新版本)。然后它将它们合并在一起,在 afterFind() 中再次对它们进行排序等等。 .
这是有效的,尽管它比我希望的要冗长一些。
毕竟,我意识到在这个应用程序的其他部分,有些模型会手动加入预订表并搜索预订。所以现在我需要一种方法,能够将修改合并到所有这些手动连接中,直接连接到 MySQL 中的表,而不影响原始数据,最好不要更改太多代码。
我的想法是我需要删除手动连接并创建模型关联。请问beforeFind()和 afterFind()当我查询说有许多预订的客户模型时,预订模型仍然运行(将修改应用于每个预订)?
我的另一个选择是通过删除可能包含在修改中的任何条件从 MySQL 返回比必要更多的行,然后使用 PHP 根据我的搜索条件过滤结果。这个选项让我有点害怕,因为如果没有这个标准,结果集可能会很大......
我怎样才能实现这种数据结构?我的关键需求仍然是我不想改变原来的Booking记录,而是在上面添加Modification记录,但我需要能够通过模型查询预订(包括修改)。
我想尝试在幕后尽可能多地保留这种集成,这样我就不必遍历整个应用程序来更改 n如下所示的查询数量:
$get_blue = $this->Booking->find('all', array(
'conditions' => array(
'Booking.abc' => 'blue'
)
));
$get_transactions_on_blue_bookings = $this->Transaction->find('all', array(
'joins' => array(
array(
'table' => 'sql_bookings_table', // non-standard Cake format, I know - it's an example
'alias' => 'Booking',
'type' => 'LEFT',
'conditions' => 'Booking.booking_id = Transaction.booking_id'
)
),
'conditions' => array(
'Booking.abc' => 'blue'
)
));
before 和 afterFind() 回调函数中)。最佳答案
听起来您正在尝试实现 Temporal Database .时间支持是对 ANSI/ISO SQL:2011 标准的主要补充之一。 MySQL(与大多数 RDBMS 一样)落后于标准。将临时数据库视为 CVS/SVN/Git 的 DBMS 等价物。
相比之下,我们使用的没有时间特征的传统数据库可以称为当前数据库 .
在 当前数据库 ,如果您尝试实现时间支持,您可能会以多种方式失败,使用不同的方法:
UPDATEs在您的原始记录上,除非您有某种自行开发的触发/审计逻辑,否则历史记录是不存在的。即使您有审核/更改日志,您也必须进行一些丑陋的挖掘以重建更改历史记录。 INSERTs , 和天堂帮助你如果 UPDATE或 DELETE需要。设置很脆弱,可能会不同步,例如死锁和回滚。如果您不使用触发器/过程在数据库中执行此操作,您可以尝试在应用程序代码中实现结果计算,但祝您好运 - 多线程消费者可能会变得丑陋。而且,您无法轻松访问仅应用一些修改的结果。 关于php - 有效管理数据变更,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24297338/
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co