论坛首页 编程语言技术论坛

ROR的数据表名可以不带s

浏览 5467 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-11-07  
哎,是我嘴太快手太慢了。已经知道怎么弄了。
set_table_name就可以了。
请管理员放到新手区或隐藏了吧,哎,惭愧:oops:

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

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

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

不解。
而且如果所有的表名全都带s,也不是特别合适,有些英文的复数是以es结尾的,class->classes,有些复数就是本身如people->people,这也不太合语法啊。
再一个就是对数据库层的侵入有点强,一个框架不应该干涉到数据库表的设计吧。  
   发表时间: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 写道

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

如前面所说,它没有干涉,它就是个约定,你可以不按它的约定来做,换来的就是一堆麻烦事。
0 请登录后投票
   发表时间:2006-11-07  
一句话就是约定胜于配置。
懒人最爱,灵活的配置并是任何时候都需要,为了1%的需要就要牺牲99%的常规情况,太浪费。
0 请登录后投票
   发表时间: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都会有这样的疑问吧。
0 请登录后投票
   发表时间:2006-11-08  
查了一下api,应该这样指定:
ActiveRecord::Base.pluralize_table_names = false
问题解决了,谢谢茄子
0 请登录后投票
   发表时间:2006-11-10  
我想知到怎么 不默认用id
实际开发 不能所有的表ID 都命名为“ID”
0 请登录后投票
   发表时间:2006-11-10  
qiezi 写道

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


ror这么强啊,偶很好奇这个功能是怎么实现的,难道它内建了一个词汇表来做复数映射,还是简单地根据s或者y结尾来做一个判断?
0 请登录后投票
   发表时间: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

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics