`

rails结合oracle时的一些命名麻烦处理

 
阅读更多
大概翻了一下书店里的一些关于Ruby on Rails的书籍,和网上的一些教材,大多都是讲述rails和MySql的的例子,并且例子中用到的表结构大部份都是使用rails默认主键名称“ID”, 并且大都遵行Rails的默认命名规则。对象用单数,表名用复数,主键默认为“id”类型为自增类型的。如果是Oracle数据库的话没有自增类型的字段,就要建间一个名称为“表名_seq”的sequence(序列)。这对于将一个现有的系统转型为Ruby无疑是太多的限制。网上关于解决这方面的中文教程却很少。因此把我的学习经验发出来与大家共享。

背景:
刚接触Ruby,想把一个现有系统的部份主要功能用Ruby实现,看Ruby是否真如它说的那样能提高程序员很高的开发效率。因此所有的操作都必须在已为的数据库结构中实现。所以就要解除rails默让规则的限制。数据库用的是oracle9i,以一个最简单的例子“系统登陆”讲述这次的学习过程。

这个功能涉及三张表:S_USER(用户表)  S_ROLE(角色表) S_USER_2_ROLES(用户与角色的关系)



create table S_ROLE
(
  ROLE_ID   VARCHAR2(10) not null,
  ROLE_NAME VARCHAR2(30),
  POPEDOMS  NCLOB,
  ROLE_BEW  VARCHAR2(20),
  ROLE_JB   VARCHAR2(1)
);
create table S_USER
(
  USER_ID        VARCHAR2(6) not null,
  USER_NAME      VARCHAR2(20),
  PASSWD         VARCHAR2(32),
  DEPARTMENT_NUM VARCHAR2(12),
  PHONE_NUM      VARCHAR2(21),
);
create table S_USER_2_ROLES
(
  USER_ID VARCHAR2(10),
  ROLE_ID VARCHAR2(10)
);

用户与角色是多对多的关系。用过rails的朋友看了以上这个表结构有很多地主都与rails的默认惯例不符,主要体现为以下内容:
1、rails默认表名都是复数的,这里面的表名都不是复数。
2、rails默认主键名称为ID,类型为自动类型。而这里面S_USER的主键为USER_ID,S_ROLE的主键为ROLE_ID并且都是字符型。
3、在多对多的关系时,保存关系的表名默认为:“表名1_表名2”,两个表名以字母的顺序排列,所以默认情况下上面这个结构的关系统表的名称应该是“S_ROLE_S_USER”,因为R的字母在U的字母前面。而我这里的表名是S_USER_2_ROLES显示也与Rails的默认惯例不符。
4、rails默认在多对多的关系时,中间表的中保存两个表的主键的字段应该为“类名的小写_id”也就是我上面的S_USER_2_ROLES应改为如下结构:



create table S_USER_2_ROLES
(
  rails中用户表的类名_ID VARCHAR2(10),
  rails中角色表的类名_ID VARCHAR2(10)
)

可是这已经是一个现有系统,暂时不可能这样改。

好了目前面对的是以上的这些总是,下面看看我们要怎么解决这些总是。首先先看看rails中有什么函数能帮我们解决这些总是。
一、解决问题1、2:参考Class  ActiveRecord::Base帮助:
它有以下函数帮我们解决这些问题
set_table_name(value = nil, &block)
用于设置对象与数据库对应的表名。

set_sequence_name(value = nil, &block)
如果是使用Oracle并且想使用类似于自动主键的功能,可以设置这个值,告诉rails用哪个序例来实现自增。

set_primary_key(value = nil, &block)
设置表的主键名称,这样可以解除rails中默认id字段为主键的限制。
以下是一个例子:
class SRole < ActiveRecord::Base
set_table_name "s_role" #设置本对象与数据表s_role对应
set_primary_key 'role_id' #设置该表的字段为role_id
end
class SUser < ActiveRecord::Base
set_table_name "s_user"
set_primary_key 'user_id'
end

一、解决问题3、4:参考Module ActiveRecord::Associations::ClassMethods帮助:
d 在处理多对多的对应关系时,我们会用到has_and_belongs_to_many(association_id, options = {}, &extension)函数。这个函数的第二个参数是一个hash表。里面的一些值可以帮助我们解除rails的默认

:class_name 用于指定与本Class关联的类的名称。
:join_table 用于指定保存对应关系统的中间表的名称。如我们上面的例子中可以指定这个键的值为s_user_2_roles,来解决问题3.
:foreign_key 用于指定中间表中用于记录本类的主键的字段的名称。
:association_foreign_key 用于指定中间表中记录关系类的主键的字段的名称。结合:foreign_key 我们可以用这个属性帮助解决上面的问题4
另外还有一些有用的键值如:
:order 指定关系类的排序方式。
:offset 指定从第几个记录开始提取
:limit 指定提取多少条记录等等.....

最后给出我们上面这个实例中的完整代码:
class SUser < ActiveRecord::Base
has_and_belongs_to_many :roles,:foreign_key=>"user_id",
  :association_foreign_key =>"role_id",:class_name=>"SRole",:join_table=>"S_USER_2_ROLES"
set_table_name "s_user"
set_primary_key 'user_id'
end

class SRole < ActiveRecord::Base
has_and_belongs_to_many :users,:foreign_key=>"role_id",
  :association_foreign_key =>"user_id",:class_name=>"SUser",:join_table=>"S_USER_2_ROLES"
set_table_name "s_role"
set_primary_key 'role_id'
end
分享到:
评论

相关推荐

    rails连接oracle需要的驱动

    rails连接oracle需要的驱动 执行命令:C:\&gt; ruby 文件名.rb &lt;br&gt;

    结合使用 Oracle 和 Ruby on Rails 教程

    要将Oracle与Rails结合,我们需要一个适配器,如`activerecord-oracle_enhanced-adapter`,这是一个官方维护的Oracle数据库适配器,可以实现Rails和Oracle之间的通信。 安装`activerecord-oracle_enhanced-adapter`...

    rails2.1與Oracle 連結所需gem

    标题“rails2.1与Oracle连接所需gem”指的是在Rails 2.1版本的应用程序中,如何配置和使用Oracle数据库的宝石(gem)扩展。Rails是Ruby on Rails框架的简称,是一个流行的开源Web应用程序框架,而Oracle则是一种企业...

    在RHEL上安裝設置ROR(nginx+passenger+ruby+rails+oracle+netzke)

    在RHEL(Red Hat Enterprise Linux)系统上搭建Ruby on Rails(简称RoR)应用程序环境是一项技术性较强的任务,尤其当涉及到与其他服务如Nginx、Phusion Passenger、Ruby、Rails以及Oracle数据库集成时。以下是对这...

    Flex3与Rails结合

    ### Flex3与Rails结合:构建HelloWorld应用 在探索如何将Adobe Flex3...这种结合利用了Rails在后端处理和数据管理方面的能力,以及Flex在前端UI设计和动画制作上的优势,为开发者提供了构建现代Web应用的强大工具集。

    Rails项目源代码

    Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...

    使用Aptana+Rails开发Rails Web应用(中文)

    在开发Web应用时,Ruby on Rails(简称Rails)框架因其高效、简洁的代码风格和强大的社区支持而备受青睐。Aptana是一款强大的集成开发环境(IDE),尤其适用于Rails项目的开发,它提供了丰富的特性来提升开发效率。...

    Rails101_by_rails4.0

    此外,书中还介绍了一些Rails中的高级概念,如Strong Parameters(强参数),它在Rails 4.0版本中引入,用于解决之前版本中的参数篡改问题,从而帮助开发者安全地处理外部提交的数据。 通过一系列的教学内容,包括...

    rails指南 中文版

    9. **ActiveJob**:Rails的后台任务处理框架,可以配合各种队列服务(如Resque、Sidekiq等)处理异步任务。 10. **Rails Console**:提供了一个交互式的命令行工具,用于检查和调试应用,执行Ruby代码,以及与...

    关于rails 3.1 cucumber-rails 1.2.0

    结合Rails 3.1的Asset Pipeline和Cucumber-Rails 1.2.0,开发者能够构建出一个既高效又健壮的Web应用程序。Asset Pipeline优化了前端资源的处理,Cucumber-Rails则提供了强大的测试工具,确保代码的质量和功能符合...

    Rails 101 入门电子书

    ### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...

    RubyonRails之Oracle应用_简易教程.doc

    在使用Rails与Oracle结合开发时,需要注意以下几点: 1. 安装并配置Oracle数据库驱动和适配器。 2. 调整Rails的数据库配置以适应Oracle的特性,例如事务管理和数据类型。 3. 可能需要对Rails的默认行为进行修改,以...

    RAILS2.1的中文版资料

    Rails 2.1增加了对时区的支持,这意味着应用程序可以更好地处理不同地理位置用户的时间显示问题。通过这一特性,开发人员能够确保应用程序中的日期和时间能够准确地反映用户的本地时间设置。 **脏数据追踪(Dirty ...

    rails2-sample

    这一部分将覆盖一些高级的Rails主题,如性能优化、多线程和并发处理、部署策略等。对于想要深入了解Rails框架并构建高性能Web应用的开发者来说,这些知识是必不可少的。 #### 10. Rails Plugins(Rails插件) ...

    Ruby on Rails源代码

    9. **中间件**:Rails使用中间件栈来处理HTTP请求,每个中间件都有机会在请求到达应用和离开应用时执行操作。通过研究`config/application.rb`中的`config.middleware`,你可以学习如何添加、移除和调整中间件。 10...

    rails api(文档)

    5. **版本控制**:API的版本控制很重要,Rails API允许你为不同版本的API创建独立的命名空间,确保向后兼容性。 6. **错误处理**:Rails API鼓励返回标准的HTTP状态码和结构化的错误消息,以便客户端可以理解并适当...

    Advanced Rails

    1. **优化性能**:Rails应用在处理大量请求时可能会面临性能挑战。书中会介绍如何通过缓存(如Action Cache和Page Cache)、数据库查询优化、资产管道优化等手段提升应用性能。 2. **复杂的路由**:Rails的路由系统...

    rails 3.2 API

    Rails 3.2 API 是一个重要的开发资源,主要用于Ruby on Rails框架的开发。Rails是基于Ruby语言的一个开源Web应用程序框架,...在学习和使用Rails 3.2 API时,建议结合实际项目进行实践,这样能更好地理解和掌握其精髓。

Global site tag (gtag.js) - Google Analytics