`
together
  • 浏览: 219196 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

ROR的数据表名可以不带s

    博客分类:
  • ruby
阅读更多
哎,是我嘴太快手太慢了。已经知道怎么弄了。
set_table_name就可以了。
请管理员放到新手区或隐藏了吧,哎,惭愧:oops:

原文
引用
因为刚学,所以有些疑惑就想赶紧说出来。

如题,如果我的数据表名不带s,是不是就不能使用ror来开发了?或者说使用它开发也可以,但必须把所有数据库相关的操作(crud/list)都手工实现一遍(ROR的高效率也就打了折扣)呢?

那么,如何来理解rails的开发者,为什么要强制要求表名带s呢?比如users这个表,它在分页显示中,会传给view页面一个@users列表,在crud的时候,则会创建一个@user对象,但是这和数据表的名字也没有什么关系吧?

不解。
而且如果所有的表名全都带s,也不是特别合适,有些英文的复数是以es结尾的,class->classes,有些复数就是本身如people->people,这也不太合语法啊。
再一个就是对数据库层的侵入有点强,一个框架不应该干涉到数据库表的设计吧。  
分享到:
评论
7 楼 qiezi 2006-11-10  
Readonly 写道
qiezi 写道

它并不是简单地加个s,它知道class的复数是classes,reply的复数是replies。。。当然不保证所有复数它都知道。


ror这么强啊,偶很好奇这个功能是怎么实现的,难道它内建了一个词汇表来做复数映射,还是简单地根据s或者y结尾来做一个判断?

它依据下面这个规则来处理单数化和复数化,可能不完整,但大部分情况下差不多了。
Inflector.inflections do |inflect|
  inflect.plural(/$/, 's')
  inflect.plural(/s$/i, 's')
  inflect.plural(/(ax|test)is$/i, '\1es')
  inflect.plural(/(octop|vir)us$/i, '\1i')
  inflect.plural(/(alias|status)$/i, '\1es')
  inflect.plural(/(bu)s$/i, '\1ses')
  inflect.plural(/(buffal|tomat)o$/i, '\1oes')
  inflect.plural(/([ti])um$/i, '\1a')
  inflect.plural(/sis$/i, 'ses')
  inflect.plural(/(?:([^f])fe|([lr])f)$/i, '\1\2ves')
  inflect.plural(/(hive)$/i, '\1s')
  inflect.plural(/([^aeiouy]|qu)y$/i, '\1ies')
  inflect.plural(/(x|ch|ss|sh)$/i, '\1es')
  inflect.plural(/(matr|vert|ind)ix|ex$/i, '\1ices')
  inflect.plural(/([m|l])ouse$/i, '\1ice')
  inflect.plural(/^(ox)$/i, '\1en')
  inflect.plural(/(quiz)$/i, '\1zes')

  inflect.singular(/s$/i, '')
  inflect.singular(/(n)ews$/i, '\1ews')
  inflect.singular(/([ti])a$/i, '\1um')
  inflect.singular(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i, '\1\2sis')
  inflect.singular(/(^analy)ses$/i, '\1sis')
  inflect.singular(/([^f])ves$/i, '\1fe')
  inflect.singular(/(hive)s$/i, '\1')
  inflect.singular(/(tive)s$/i, '\1')
  inflect.singular(/([lr])ves$/i, '\1f')
  inflect.singular(/([^aeiouy]|qu)ies$/i, '\1y')
  inflect.singular(/(s)eries$/i, '\1eries')
  inflect.singular(/(m)ovies$/i, '\1ovie')
  inflect.singular(/(x|ch|ss|sh)es$/i, '\1')
  inflect.singular(/([m|l])ice$/i, '\1ouse')
  inflect.singular(/(bus)es$/i, '\1')
  inflect.singular(/(o)es$/i, '\1')
  inflect.singular(/(shoe)s$/i, '\1')
  inflect.singular(/(cris|ax|test)es$/i, '\1is')
  inflect.singular(/(octop|vir)i$/i, '\1us')
  inflect.singular(/(alias|status)es$/i, '\1')
  inflect.singular(/^(ox)en/i, '\1')
  inflect.singular(/(vert|ind)ices$/i, '\1ex')
  inflect.singular(/(matr)ices$/i, '\1ix')
  inflect.singular(/(quiz)zes$/i, '\1')

  inflect.irregular('person', 'people')
  inflect.irregular('man', 'men')
  inflect.irregular('child', 'children')
  inflect.irregular('sex', 'sexes')
  inflect.irregular('move', 'moves')

  inflect.uncountable(%w(equipment information rice money species series fish sheep))
end

6 楼 Readonly 2006-11-10  
qiezi 写道

它并不是简单地加个s,它知道class的复数是classes,reply的复数是replies。。。当然不保证所有复数它都知道。


ror这么强啊,偶很好奇这个功能是怎么实现的,难道它内建了一个词汇表来做复数映射,还是简单地根据s或者y结尾来做一个判断?
5 楼 jfy3d 2006-11-10  
我想知到怎么 不默认用id
实际开发 不能所有的表ID 都命名为“ID”
4 楼 together 2006-11-08  
查了一下api,应该这样指定:
ActiveRecord::Base.pluralize_table_names = false
问题解决了,谢谢茄子
3 楼 together 2006-11-08  
是配置大于约定吧。

多谢茄子老兄的回复!
不过按你说的在enviroment.rb里最后一行加上ActiveRecord::Base.pluralize_table_name = false
无法启动script/server,在运行:ruby script/generate scaffold xxx时也是报错的:
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/base.rb:1129:in `method_missing': undefined method `pluralize_table_name=' for ActiveRecord::Base:Class (NoMethodError)

问出这个问题来,真的是业余。不过可能相当一部分人初接触ROR都会有这样的疑问吧。
2 楼 edgeloner 2006-11-07  
一句话就是约定胜于配置。
懒人最爱,灵活的配置并是任何时候都需要,为了1%的需要就要牺牲99%的常规情况,太浪费。
1 楼 qiezi 2006-11-07  
together 写道
如果我的数据表名不带s,是不是就不能使用ror来开发了?或者说使用它开发也可以,但必须把所有数据库相关的操作(crud/list)都手工实现一遍(ROR的高效率也就打了折扣)呢?

在environment.rb里加上:
ActiveRecord::Base.pluralize_table_name = false
together 写道

那么,如何来理解rails的开发者,为什么要强制要求表名带s呢?比如users这个表,它在分页显示中,会传给view页面一个@users列表,在crud的时候,则会创建一个@user对象,但是这和数据表的名字也没有什么关系吧?

这么来理解:它就是个约定,也可以约定不使用复数形式(按上面的设置),也可以约定为复数形式,有了约定就可以不用在每个地方去指定,当然你也可以指定表名,但它作为一个约定就是为了省事的。
together 写道

而且如果所有的表名全都带s,也不是特别合适,有些英文的复数是以es结尾的,class->classes,reply->replies,这也不太合语法啊。

它并不是简单地加个s,它知道class的复数是classes,reply的复数是replies。。。当然不保证所有复数它都知道。
together 写道

再一个就是对数据库层的侵入有点强,一个框架不应该干涉到数据库表的设计吧。

如前面所说,它没有干涉,它就是个约定,你可以不按它的约定来做,换来的就是一堆麻烦事。

相关推荐

    RoR性能优化经验谈

    Lighttpd在完全接收POST数据后才一次性转发,同时在接收应用服务器响应时也不限制Buffer大小,从而减少了应用服务器的延迟,提高了资源利用率。 除了部署层面的优化,RoR自身的代码优化也很重要。这可能涉及数据库...

    ror中文资料

    RoR强调“约定优于配置”,提供了一套完整的工具链,使得开发者可以更专注于业务逻辑,而不是底层实现。 在提供的压缩包文件中,我们可以看到"Ruby语言中文教程",这暗示了资源可能包含了关于Ruby语言的基础知识和...

    神经网络ror resenet模型

    在每个残差块中,输入信号可以直接传递到输出,而不需要通过一系列的卷积层和激活函数。如果网络能够完美学习到输入的微小变化,那么这个残差块的输出就等于输入,即“学习到的残差”为零。这样,即使网络很深,也能...

    RoR选题方向—源代码

    源代码是理解任何编程语言或框架工作原理的关键,对于RoR来说也不例外。 在深入源代码之前,我们需要了解RoR的一些核心概念。如ActiveRecord,它是RoR中的ORM(对象关系映射)库,允许开发者用Ruby代码操作数据库,...

    ror

    NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696

    ror实例

    Ruby on Rails(简称RoR或Rails)是一种基于Ruby语言的开源Web应用框架,它遵循Model-View-Controller(MVC)架构模式,旨在提高开发效率并提供简洁、优雅的代码结构。"ror实例"可能指的是在学习或实践中,通过创建...

    初探ROR

    1. MVC架构:Rails将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分,分别负责数据处理、用户界面展示和业务逻辑控制。 2. 数据库集成:Rails通过ActiveRecord组件与数据库进行交互,提供...

    ROR安装必备所有架包

    这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails的核心组件之一,它提供了控制器、路由和视图等功能。`actionpack-1.13.5....

    ROR 文件的上传与下载

    - `MEDIUMBLOB`:可以存储到16MB的数据 - `LONGBLOB`:最大容量达到4GB 选择合适的BLOB类型对于优化数据库性能和存储空间管理至关重要。例如,在本例中,`MEDIUMBLOB`被选中,因为它足以满足大多数文件的大小需求,...

    RoRBlog 基于RoR的博客系统

    基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。

    机遇ROR 的图书管理系统

    《机遇ROR的图书管理系统》是一份以Ruby on Rails(简称ROR)技术为核心,旨在构建高效、便捷的图书管理解决方案的学习资料。Ruby on Rails,是基于Ruby编程语言的开源Web应用框架,它遵循MVC(Model-View-...

    freemis 基于ror框架的mis

    同时,熟悉数据库设计和管理也是必不可少的,因为RoR的ActiveRecord与数据库紧密关联。 总结,FreeMIS是一个运用了Ruby on Rails强大特性的管理信息系统实例,它体现了敏捷开发的理念,为开发者提供了快速构建企业...

    ROR环境配置

    在Eclipse中,你可以利用其强大的代码编辑、调试、重构和版本控制功能进行ROR开发。例如,你可以通过右键点击文件进行Run As -> Ruby Application来运行你的ROR应用。同时,Eclipse的集成版本控制系统如Git可以帮助...

    ror留言板程序

    通过这个"ror留言板程序",开发者可以学习到Ruby on Rails的基础知识,如路由设置、控制器操作、模型关联、视图渲染,以及如何利用数据库进行数据交互。此外,还可以了解到测试驱动开发(TDD)的概念,以及如何组织...

    ror文本编辑插件

    在Ruby on Rails(RoR)框架中,开发者经常需要处理用户输入的数据,这通常涉及到文本编辑器的使用。"ror文本编辑插件"显然是一种专为Rails应用设计的工具,旨在提升用户在网页上编辑文本的体验。这个插件可能包含...

    Windows 上搭建 ROR环境

    ### Windows上搭建Ruby on Rails(ROR)环境详解 #### 一、引言 随着Web开发技术的不断发展,Ruby on Rails(简称Rails或ROR)作为一种高效、简洁且优雅的Web开发框架,受到了广大开发者的青睐。然而,在Windows...

    excel lib ror ruby

    它不依赖于Excel应用程序,而是直接操作文件结构,因此可以在任何平台上工作。`ruby-ole-1.2.11.4.gem` 文件是这个库的安装包,可以使用Ruby的gem管理器进行安装。 4. **example.txt**: 这可能是一个包含使用这些库...

    RoR中文解决方案(很不错哦)

    用户可以使用这个文件来重建或填充一个RoR应用所依赖的数据库,特别是当应用涉及到中文数据时,这个文件可能已经包含了正确的编码设置,以确保中文字符能被正确处理。 “jascaffold”则可能是另一个RoR插件,它提供...

    RoR 培训课程PPT

    - **ActiveRecord基础**:介绍RoR的核心ORM框架ActiveRecord的基本用法,包括查询、更新和删除数据等操作。 - **关联、验证及回调**:深入讲解ActiveRecord中的关联关系(如一对一、一对多等),以及如何进行数据...

Global site tag (gtag.js) - Google Analytics