在rails中向多张关联的表中插入数据的问题。

问题描述

我现在要讲一个服务注册到数据库中去,先简单说一下情况因为一个服务有具体的名称,还有不同的服务类型(其实这里有两种类型,比如下面的soap_services,还有一个是rest_services,注册的时候可以选择注册的类型,然后跳转到具体的类型页面,提交相应的数据,这里提交的是XML的文档,我将它进行了解析,但是不知道如何完整的存到数据库里面去),同时还有若干个操作,每个操作又有若个个参数我现在要用四张表来存储,第一个表里面只存服务的名称,第二个表里面存服务名称和描述,第三个表里面存储服务包含的操作名称,描述,第四个表里面存服务某一个具体操作的参数和描述(最后的两个表4_1和 4_2是并列的,因为每个服务的输入输出个数不一样,一张表无法解决)具体的表是这样设计的 第一张表class CreateServices < ActiveRecord::Migration def self.up create_table :services do |t| t.column :name, :string t.column :user_id, :integer t.column :updated_at, :datetime t.column :created_at, :datetime end end def self.down drop_table :services endend第2张表class CreateSoapServices < ActiveRecord::Migration def self.up create_table :soap_services do |t| t.column :name, :string t.column :wsdl_location, :string t.column :namespace, :string t.column :description, :text t.column :updated_at, :datetime t.column :created_at, :datetime end end def self.down drop_table :soap_services endend第3张表class CreateSoapOperations < ActiveRecord::Migration def self.up create_table :soap_operations do |t| t.column :name, :string t.column :description, :text t.column :soap_service_id, :integer t.column :parameter_order, :string t.column :parent_port_type, :string t.column :soap_service_port_id, :integer t.column :updated_at, :datetime t.column :created_at, :datetime end end def self.down drop_table :soap_operations endend第4_1张表class CreateSoapInputs < ActiveRecord::Migration def self.up create_table :soap_inputs do |t| t.column :name, :string t.column :description, :text t.column :soap_operation_id, :integer t.column :computational_type, :string t.column :computational_type_details, :text, :limit => 2.megabytes t.column :min_occurs, :integer t.column :max_occurs, :integer t.column :updated_at, :datetime t.column :created_at, :datetime end end def self.down drop_table :soap_inputs endend第4_2张表class CreateSoapOutputs < ActiveRecord::Migration def self.up create_table :soap_outputs do |t| t.column :name, :string t.column :description, :text t.column :soap_operation_id, :integer t.column :computational_type, :string t.column :computational_type_details, :text, :limit => 2.megabytes t.column :min_occurs, :integer t.column :max_occurs, :integer t.column :updated_at, :datetime t.column :created_at, :datetime end end def self.down drop_table :soap_outputs endend提交的数据是在soap_services 的new页面中,如何能先将服务的名称存在第一张表里面,然后根据第二张表根据第一个表存储的id关联,同时能将数据存到其他相关的表格,麻烦了,刚刚接触这块,对数据库的知识也不是很懂! 问题补充:Soloara 写道

解决方案

老弟又是你啊,还是你的soap service项目哈,那我简单给你提个醒吧1. 数据库表设计这个你要想清楚, 比如, Services表和SoapServices表,是怎么关联的?(不应该是有相同的name吧?) Serivices表和SoapServices表是什么关系,一对一,一对多? 其他,SoapOperations,SoapInputs,SoapOutputs也是一样,先梳理清楚2. 我先假设一个表关系吧。 Services 和SoapServices一对一SoapServices和SoapOperations一对多SoapOperations和SoapInputs,SoapOutputs分别一对多那吗,你要首先在model里体现出来,用has_one, has_many, belongs_to道理上讲,这时你真正存储services信息的时候就可以存了,当然,也可以用回调了。比如,你表单提交了有关service信息 @service = Service.new(params[:service])你要同时保存其他信息,就可以用@soap_service = @service.soap_service.new(params)也会有 @service.soap_service.soap_operations.first.soap_inputs之类吧。有关系啦,当然想保存就在保存service信息时候,把其他信息保存就行了。3. 当然,这里实际还有一个问题,就是嵌套表单。因为你的表是多级嵌套的(我这里希望你不是过度设计,因为,我要是刚开始一个项目,是不会一下把表设计的很复杂,比如,我会先一个表搞定,里面啥信息都存,大不了冗余,过后,什么地方有问题,重构什么地方),所以,提交表单信息的时候,就涉及一个嵌套表单的问题,说起来也不是复杂的东西啦,railscast上有上下两集讲怎么用的,看看就好,给你个链接哈http://cn.asciicasts.com/episodes/196-nested-model-form-part-1http://cn.asciicasts.com/episodes/197-nested-model-form-part-24. 数据能提交上来就要考虑scope了,因为关联比较复杂的表,一定涉及查询怎么写的问题。当然,那是以后的事,先不提。这种情况考虑回调也是正常的想法,楼上提啦实际我也就简单一提,重点的部分还得看你,rails的思路是帮你把问题简化。
解决方案二:
详细的东西可以去http://guides.rubyonrails.org看一看关于callback这个部分
解决方案三:
每一个model在save之后用self.id可以取到自己的数据库id,当然用build也可以
解决方案四:
总之逻辑可以写在after_save或者after_create所调用的方法里面,具体回调方法里面的逻辑这个真要自己写了
解决方案五:
在第一张表对应的model里面写一个after_save :next_to_do # 这里是你要做操作的方法名啊def next_to_do # 这里是要做的操作方法 # 在这里把要对下一张表做的操作写下来 # 比如把本张表的name作为下一张表的name SoapService.create :name => self.nameend在下一个model就是SoapService里面同样这样写..........
解决方案六:
可以写一个call back啊,第一张表存好后用call back存第二张表

时间: 2024-10-31 22:07:38

在rails中向多张关联的表中插入数据的问题。的相关文章

sql server 2005中如何用语句查看 人员表 中每个人的电子邮箱域名?

问题描述 sql server 2005中如何用语句查看 人员表 中每个人的电子邮箱域名? sql server 2005中如何用语句查看 人员表 中每个人的电子邮箱域名?老师说方法有很多,然而刚开始学习数据库的小弟我并不知道,敬请大神们指点 解决方案 楼主问的问题应该是这样的,qqqq@126.com 查询结果是 126.com 可以试一下下面的方法select substring(email_address charindex('@'email_address1)+1len(email_ad

sql查询表中字段值在另一个表中的字段是否出现过

问题描述 sql查询表中字段值在另一个表中的字段是否出现过 各位大神,小弟初学sql想请教一个问题~~先谢谢大家啦~~ 例如我有两个表: 表A:personal (人员表) pid name 1 aaa 2 bbb 3 ccc 4 ddd 5 eee 6 ffff 7 ggg 表B:metting (会议表,pidlist代表参加会议的人员,用"|"分隔) mid pidlist 1 |2|3|4| 2 |1|3|4| 3 |1|2|4| 我想要 列出表A中没有参加会议的人,如果按我的

winforms-C#Winfrom中如何在combox中输入首字母下拉表中出现对应汉字

问题描述 C#Winfrom中如何在combox中输入首字母下拉表中出现对应汉字 如题,我在数据库中建立了表,首字母和相应的汉字都有,如何在程序中让combox输入首字母显示出汉字呢,就像12306订票系统一样,在站台名中输入首字母出现汉字. 解决方案 因为你已经有你的数据库表,所以可以参考一下根据拼音首字母进行过滤的combobox关于扩展可以支持拼音首字母查询的ComboBox自定义控件,可以参考支持拼音首字母查询的ComboBox 解决方案二: 参考:http://download.csd

iOS 数据库第二。三张表不能插入数据,第一张可以,为什么

问题描述 iOS 数据库第二.三张表不能插入数据,第一张可以,为什么 (id)init { self = [super init]; if (self) { NSArray * arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); _filePath = [arr objectAtIndex:0]; _filePath = [_filePath stringByAppendin

asp.net中利用ajax获取动态创建表中文本框的值_实用技巧

假设现在主表为公司表(公司ID,公司名称,公司类型,公司规模),从表为部门表(部门ID,公司ID,经理,联系电话),现在一个公司有四个部门,要在同一个页面上录入公司信息以及四个部门的信息,如何动态创建部门信息录入口,以及如何获取数据存储到数据库中,请看下面的代码. 页面HTML代码及js脚本 代码 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" Codebehind="Default.

hibernate中怎么指定自动生成数据库表中字段的类型

问题描述 在网上当了个小项目学习.利用实体类和hbm.xml反向生成了数据库中表,其中一个实体类的一个属性为boolean,反向生成表后在oracle数据库中对应的字段是number(1).突然想是否在反向生成表的时候可以指定数据库中字段的类型.比如说把这里的Number(1)在自动生成时改为char类型的.这种功能是否可以实现呢,要怎样实现?求高手指点! 解决方案 解决方案二: hibernate好像不可以这样吧!解决方案三: 引用1楼duanwu2330323的回复: hibernate好像

mybatis-Spring+Mybatis从两张表中取值并传值到页面 分页

问题描述 Spring+Mybatis从两张表中取值并传值到页面 分页 我写的Dao //根据登陆ID查询直属下属 (分页) List> findByid(String id,RowBounds rowBounds); 对应的mapper SELECT u.user_code,a.totasalar from c_user_info u JOIN c_attence_info aON u.id=a.relatedid where department=(SELECT department FRO

数据库中把一张表中的值传给另一张表中相同的字段

问题描述 数据库中把一张表中的值传给另一张表中相同的字段 数据库中有两张表A,B,大部分字段相同,A表中没有数据,要把B表中的数据传给A表中相对应的字段 解决方案 11两种情况 2.B表中的行在A表中都有,A表仅是缺少部分数据列 UPDATE A SET A.F1 = B.F1,A.F2=B.F2 FROM B WHERE A.Id = B.Id AND B.Filter=... 3.B表中的数据未必在A表中都用,A表不仅缺数据列,还缺数据行.要执行两句(MSSQL) INSERT INTO A

Oracle中向视图中插入数据

插入视图的条件: 1.如果视图是基于一个基础表产生的,那么这就称为非连接视图,所有的非连接视图都是可以更新的,也就是说可以在该视图上进行,INSERT,UPDATE,DELETE的操作. 2.如果是连接视图,那就要遵守基本更新准则了.现在我只对INSERT准则做一下说明:在INSERT语句中不能显式或隐式的引用到任何非码保留基础表中的字段,如果在定义视图中使用了WITH CHECK OPTION子句,那就不能对视图执行INSERT操作. 注:码保留表,非码保留表的解释: 在DEPT中,DEPT_